Wunschtemperaturen

Begonnen von Damian, 29 Januar 2022, 19:25:50

Vorheriges Thema - Nächstes Thema

Damian

Hiermit kann man eine Steuerung der Raumtemperaturen mit GUI für sein Smart Home erstellen. Der Verlauf der Raumtemperaturen wird visualisiert. Die Anzahl der Zeitpunkte sowie Anzahl der Räume kann beliebig erweitert werden. Funktioniert mit Wandthermostaten von Homematic, kann jedoch auch für andere Thermostate leicht angepasst werden.

defmod di_Therm DOIF subs  {\
## Schaltzeitpunkte, Liste kann angepasst werden  \
@{$_Timer}= qw(morgens vormittags nachmittags abends);;\
@{$_Timer_default_at} = qw(04:00 08:00 13:00 22:00);;\
@{$_Timer_default_we} = qw(05:00 09:00 13:00 22:00);;\
$_temp_default_at=20;; ## 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\
\
\
## Definition der Räume mit dazugehörigen Thermostaten, Angaben können zweilenweise erweitert werden\
push (@{$_sc},[qw(Bad TH_Bad_HM)]);;\
push (@{$_sc},[qw(Dachgeschoss TH_DG_HM)]);;\
push (@{$_sc},[qw(Kueche TH_Kueche_HM)]);;\
push (@{$_sc},[qw(Kinderzimmer_ost TH_Kz_o_HM)]);;\
push (@{$_sc},[qw(Kinderzimmer_west TH_Kz_w_HM)]);;\
push (@{$_sc},[qw(Wohnzimmer TH_WZ_HM)]);;\
push (@{$_sc},[qw(Keller TH_Keller_HM)]);;\
\
## 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<@{$_Timer};;$j++)  { ## Für alle Timer\
  set_Reading($_Timer[$j],$_Timer_default_at[$j]);; ## Vorbelegung der Zeit für Arbeitstage\
  set_Reading("$_Timer[$j]_WE",$_Timer_default_we[$j]);; ## Vorbelegung der Zeit für Wochenende\
      for (my $i=0;;$i < @{$_sc};;$i++)  { ## Vorbelegung der Wunschtemperaturen für alle Räume\
     set_Reading("$_sc[$i][0]_temp_at_$_Timer[$j]",$j % 2 ? $_temp_default_at-$_temp_default_diff: $_temp_default_at);;\
set_Reading("$_sc[$i][0]_temp_we_$_Timer[$j]",$j % 2 ? $_temp_default_we-$_temp_default_diff: $_temp_default_we);;\
  }\
}\
}\
\
sub temp_at_set { ## Routine zum Setzen der Wunschtemperaturen aller Räume für einen Zeitpunkt an Arbeitstagen\
  my ($timer)=@_;;\
  for (my $i=0;;$i< @{$_sc};;$i++)  {\
     fhem_set("$_sc[$i][1] desired-temp ".get_Reading ("$_sc[$i][0]_temp_at_$timer"));;\
  }\
}\
sub temp_we_set { ## Routine zum Setzen der Wunschtemperaturen aller Räume für einen Zeitpunkt am Wochenende\
  my ($timer)=@_;;\
  for (my $i=0;;$i< @{$_sc};;$i++)  {\
fhem_set("$_sc[$i][1] desired-temp ".get_Reading ("$_sc[$i][0]_temp_we_$timer"));;\
  }\
}\
} ## subs\
\
DEF TPL_set_temp ( ## Definition des Templates namens TPL_set_temp zum Setzen der Thermostat-Vorgabetemperatur\
Timer_at_$1 {[$2|AT];;temp_at_set("$1");;}  ## Block zum Setzen der Wunschtemperatur an Arbeitstagen, Parameter: $1:Timername, $2:Time_AT\
Timer_we_$1 {[$3|WE];;temp_we_set("$1");;}  ## Block zum Setzen der Wunschtemperatur am Wochenende,   Parameter: $1:Timername, $3:Time_WE\
) ## TPL_set_temp\
\
## Generierung der Steuerung pro Raum mit Hilfe des obigen Templates\
FOR(@{$_Timer},TPL_set_temp($1,[$SELF:$_],[$SELF:$1_WE]))
attr di_Therm room Heizung
attr di_Therm uiTable {\
  package ui_Table;;\
  $TABLE='text-align:right;;';;\
  $TD{0}{2..5} = "align='center'";;\
  $TC{0}="align='left'";;\
}\
\
""|""|FOR (@{$_Timer},"$1"|)""\
""|"Arbeitstage"|FOR (@{$_Timer},WID([$SELF:$1],"time")|)""\
""|"Wochenende"|FOR (@{$_Timer},WID([$SELF:$1_WE],"time")|)""\
FOR (@{$_sc},"$1$1"|card([$1$2:measured-temp:col1d],undef,"temperature_humidity\@silver",17,23,undef,undef,"°C",\&temp_hue,"1,,fill:silver","130,1,,1,,,",undef,undef,[$1$2:humidity:col1d],40,60,undef,undef,"%",\&hum_hue,"0,,fill:silver")|FOR(@{$_Timer},("AT: ".widget([$SELF:$1$1_temp_at_$2],"selectnumbers,18,0.5,22,1,lin"),,"WE: ".widget([$SELF:$1$1_temp_we_$2],"selectnumbers,18,0.5,22,1,lin")|))"")


Edit: Der aktuelle Code wurde ins Wiki übernommen: https://wiki.fhem.de/wiki/DOIF/Automatisierung#Steuerung_von_Raumthermostaten_f.C3.BCr_mehrere_R.C3.A4ume_mit_GUI
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Man kann den Code auch so erweitern, dass man statt der Feuchtigkeit den Schaltverlauf der Stellantriebe zeitlich festhält. Ebenfalls lässt sich per Icon visualisieren, ob gerade das Ventil offen ist oder geschlossen - bei Interesse melden.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FHEM-User22

Hallo Damian,

Super, das istt ganz große Klasse.

Ich hätte Interesse an den Erweiterungen.


Schönen Sonntag
FHEM auf Raspberry Pi und Proxmox und... und.... und....

Damian

#3
Zitat von: FHEM-User22 am 30 Januar 2022, 09:56:30
Hallo Damian,

Super, das istt ganz große Klasse.

Ich hätte Interesse an den Erweiterungen.


Schönen Sonntag

Na, dann. Bei Fragen zum Code oder bei erforderlichen Anpassungen für eigene Geräte, bitte melden.

defmod di_Therm DOIF subs  {\
## Schaltzeitpunkte, Liste kann angepasst werden  \
@{$_Timer}= qw(morgens vormittags nachmittags abends);;\
@{$_Timer_default_at} = qw(04:00 08:00 13:00 22:00);;\
@{$_Timer_default_we} = qw(05:00 09:00 13:00 22:00);;\
$_temp_default_at=20;; ## 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\
\
\
## Angaben: Raumbezeichnung, Thermostat, Schalter;; Angaben können zweilenweise erweitert werden\
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(Keller TH_Keller_HM H_Keller)]);;\
\
## 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<@{$_Timer};;$j++)  { ## Für alle Timer\
  set_Reading($_Timer[$j],$_Timer_default_at[$j]);; ## Vorbelegung der Zeit für Arbeitstage\
  set_Reading("$_Timer[$j]_WE",$_Timer_default_we[$j]);; ## Vorbelegung der Zeit für Wochenende\
      for (my $i=0;;$i < @{$_sc};;$i++)  { ## Vorbelegung der Wunschtemperaturen für alle Räume\
     set_Reading("$_sc[$i][0]_temp_at_$_Timer[$j]",$j % 2 ? $_temp_default_at-$_temp_default_diff: $_temp_default_at);;\
set_Reading("$_sc[$i][0]_temp_we_$_Timer[$j]",$j % 2 ? $_temp_default_we-$_temp_default_diff: $_temp_default_we);;\
  }\
}\
}\
\
sub temp_at_set { ## Routine zum Setzen der Wunschtemperaturen aller Räume für einen Zeitpunkt an Arbeitstagen\
  my ($timer)=@_;;\
  for (my $i=0;;$i< @{$_sc};;$i++)  {\
     fhem_set("$_sc[$i][1] desired-temp ".get_Reading ("$_sc[$i][0]_temp_at_$timer"));;\
  }\
}\
sub temp_we_set { ## Routine zum Setzen der Wunschtemperaturen aller Räume für einen Zeitpunkt am Wochenende\
  my ($timer)=@_;;\
  for (my $i=0;;$i< @{$_sc};;$i++)  {\
fhem_set("$_sc[$i][1] desired-temp ".get_Reading ("$_sc[$i][0]_temp_we_$timer"));;\
  }\
}\
} ## subs\
\
DEF TPL_set_temp ( ## Definition des Templates namens TPL_set_temp zum Setzen der Thermostat-Vorgabetemperatur\
Timer_at_$1 {[$2|AT];;temp_at_set("$1");;}  ## Block zum Setzen der Wunschtemperatur an Arbeitstagen, Parameter: $1:Timername, $2:Time_AT\
Timer_we_$1 {[$3|WE];;temp_we_set("$1");;}  ## Block zum Setzen der Wunschtemperatur am Wochenende,   Parameter: $1:Timername, $3:Time_WE\
) ## TPL_set_temp\
\
## Generierung der Steuerung pro Raum mit Hilfe des obigen Templates\
FOR(@{$_Timer},TPL_set_temp($1,[$SELF:$_],[$SELF:$1_WE]))
attr di_Therm room Heizung
attr di_Therm uiTable {\
  package ui_Table;;\
  $TABLE='text-align:right;;';;\
  $TD{0}{2..5} = "align='center'";;\
  $TC{0}="align='left'";;\
  \
  sub onoff_hue {\
    my($redblue)=@_;;\
    return ($redblue == 0 ? 240 : 0);;  \
  }\
}\
\
""|""|FOR (@{$_Timer},"$1"|)""\
""|"Arbeitstage"|FOR (@{$_Timer},WID([$SELF:$1],"time")|)""\
""|"Wochenende"|FOR (@{$_Timer},WID([$SELF:$1_WE],"time")|)""\
FOR (@{$_sc},"$1$1"|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,,",undef,undef,[$1$3:onoff:col1d],0,5,0,0,"I-O",\&onoff_hue,"0,,fill:silver")|FOR(@{$_Timer},("AT: ".widget([$SELF:$1$1_temp_at_$2],"selectnumbers,18,0.5,22,1,lin"),,"WE: ".widget([$SELF:$1$1_temp_we_$2],"selectnumbers,18,0.5,22,1,lin")|))"")



Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#4
Wichtig ist noch, dass man den Status des Relais auf 1/0 abbildet, das kann man über userReadings der Schalter einfach realisieren, z. B.:

attr H_Bad userReadings onoff {ReadingsVal($name,"state",0) ne "on" ? 0 : 1}

oder für alle betroffenen Stellantriebschalter der Räume mit:

attr <Regex der Schalternamen> userReadings onoff {ReadingsVal($name,"state",0) ne "on" ? 0 : 1}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Man kann die Grafik auch auseinanderziehen, falls mehr Details gewünscht sind:

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Und so sieht es aus nach ein paar Stunden Laufzeit:
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Hallo Damian,

Wieder mal ein echt toller Überblick. Danke.

Eine Frage hätte ich bitte dazu:
- ich habe keine Schalter sondern meine Ventile können Werte von 0-100% annehmen.
  Wie könnte man das darstellen?

Und eines wollte ich schon seit längerem fragen.
In der Beschreibung der ui-Table im Wiki zeigst Du einen echt coolen Statusbildschirm:
https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg

Ich habe versucht mir den selber zusammen zu stellen. Aber ...  ;)
Wäre es vielleicht möglich dafür auch den Code zu posten?

Danke im Voraus
Lg, Gerhard

Damian

Zitat von: gestein am 30 Januar 2022, 20:07:37
Hallo Damian,

Wieder mal ein echt toller Überblick. Danke.

Eine Frage hätte ich bitte dazu:
- ich habe keine Schalter sondern meine Ventile können Werte von 0-100% annehmen.
  Wie könnte man das darstellen?

Das dürfte noch einfacher sein, weil du dann kein Userreading bei den Schaltern setzen musst.

statt

Zitatcard([$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,,",undef,undef,[$1$3:onoff:col1d],0,5,0,0,"I-O",\&onoff_hue,"0,,fill:silver")


Zitatcard([$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,,",undef,undef,[$1$3:onoff:col1d],0,100,120,0,"%",undef,"0,,fill:silver")

bei

[$1$3:state] eq "off"

für die Darstellung des Icons musst du das Reading deines Ventils mit der Prozentzahl angeben:

evtl.:

[$1$3:value] == 0 

Zitat
Und eines wollte ich schon seit längerem fragen.
In der Beschreibung der ui-Table im Wiki zeigst Du einen echt coolen Statusbildschirm:
https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg

Ich habe versucht mir den selber zusammen zu stellen. Aber ...  ;)
Wäre es vielleicht möglich dafür auch den Code zu posten?

Meine Übersicht hat sich inzwischen schon paar mal geändert, hier habe ich dazu etwas gepostet: https://forum.fhem.de/index.php/topic,120088.msg1170436.html#msg1170436

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Hallo Damian,

Vielen Dank.

Das mit der Übersicht muss ich mir noch anschauen.

Funktioniert fast. Toll!
In der Uni-Table musste ich nur noch den VentilPos-Parameter auch in der

In der uiTable habe ich also folgendes geändert:
FOR (@{$_sc},"$1$1"|card([$1$2:TempIst:col1d],undef,[$1$2:VentilPos:d] == 0 ? "sani_floor_heating_neutral\@silver" : "sani_floor_heating\@red" ,15,25,undef,undef,"°C",\&temp_hue,"1,,fill:silver","130,1,1,1,1,,",undef,undef,[$1$2:VentilPos:col1d],0,100,120,0,"%",undef,"0,,fill:silver")|FOR(@{$_Timer},("AT: ".widget([$SELF:$1$1_temp_at_$2],"selectnumbers,18,0.5,22,1,lin"),,"WE: ".widget([$SELF:$1$1_temp_we_$2],"selectnumbers,18,0.5,22,1,lin")|))"")

Könnte man die Solltemperatur auch noch irgendwie in den Graphen bringen?

Danke, Lg, Gerhard



Damian

Funktioniert denn das Setzen der Solltemperatur?

Zitatfhem_set("$_sc[$i][1] desired-temp ".get_Reading ("$_sc[$i][0]_temp_we_$timer"));;\

Die aktuelle Solltemperatur könntest du in der Kopfzeile der Karte unterbringen, in einem weiteren Halbring oder in einer separaten Spalte in der Tabelle definieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Das Setzen der gewünschten Temperatur ist noch ein eigenes Thema.
Ich habe nämlich die Heizungssteuerung über die Siemens synco.
Da muss ich erst noch herausfinden, wie ich das am besten setzen kann.
Das ist sicherlich ein etwas aufwändigeres Projekt ;-)

Danke für die Tipps.
Auch das schaue ich mir gerne noch an.
Könnte man denn z.B. einen Strich im Bogen der Ist-Temperatur anbringen?

Lg, Gerhard

Damian

Damit die Solltemperatur im Diagramm visualisiert wird, muss sie als weitere Temperatur angegeben werden, dann hast du schon drei Werte und dann geht es nur noch mit Halbringen. Ein Ring kann nur zwei Werte aufnehmen.

Siehe Beispiel zur Energie mit drei Werten, also drei Halbringen:

https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Anzeige_eines_Werteverlaufs_und_des_aktuellen_Wertes_mit_Hilfe_der_SVG-Funktion_card
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#13
Ich habe noch etwas dran geschraubt. Man kann jetzt pro Raum die Steuerung abschalten (off-Modus) oder auf Automatik stellen. Zusätzlich sieht man die gerade eingestellte Solltemperatur (aktuell), die man zum nächsten Zeitschaltpunkt ebenfalls verändern kann.

defmod di_Therm DOIF subs  {\
## Schaltzeitpunkte, Liste kann angepasst werden  \
@{$_Timer}= qw(morgens vormittags nachmittags abends);;\
@{$_Timer_default_at} = qw(04:30 08:00 13:00 22:00);;\
@{$_Timer_default_we} = qw(05:30 09:00 13:00 22:00);;\
$_temp_default_at=20;; ## 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\
\
\
## Angaben: Raumbezeichnung, Thermostat, Schalter;; Angaben können zweilenweise erweitert werden\
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(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<@{$_Timer};;$j++)  { ## Für alle Timer\
  set_Reading($_Timer[$j],$_Timer_default_at[$j]);; ## Vorbelegung der Zeit für Arbeitstage\
  set_Reading("$_Timer[$j]_WE",$_Timer_default_we[$j]);; ## Vorbelegung der 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_at_$_Timer[$j]",$j % 2 ? $_temp_default_at-$_temp_default_diff: $_temp_default_at);;\
set_Reading("$_sc[$i][0]_temp_we_$_Timer[$j]",$j % 2 ? $_temp_default_we-$_temp_default_diff: $_temp_default_we);;\
  }\
}\
}\
\
sub temp_at_set { ## Routine zum Setzen der Wunschtemperaturen aller Räume für einen Zeitpunkt an Arbeitstagen\
  my ($timer)=@_;;\
  for (my $i=0;;$i< @{$_sc};;$i++)  {\
     fhem_set("$_sc[$i][1] desired-temp ".get_Reading ("$_sc[$i][0]_temp_at_$timer")) if (get_Reading("$_sc[$i][0]_mode") eq "auto");;\
  }\
}\
sub temp_we_set { ## Routine zum Setzen der Wunschtemperaturen aller Räume für einen Zeitpunkt am Wochenende\
  my ($timer)=@_;;\
  for (my $i=0;;$i< @{$_sc};;$i++)  {\
fhem_set("$_sc[$i][1] desired-temp ".get_Reading ("$_sc[$i][0]_temp_we_$timer")) 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_at_$1 {[$2|AT];;temp_at_set("$1")}  ## Block zum Setzen der Wunschtemperatur an Arbeitstagen, Parameter: $1:Timername, $2:Time_AT\
Timer_we_$1 {[$3|WE];;temp_we_set("$1")}  ## Block zum Setzen der Wunschtemperatur am Wochenende,   Parameter: $1:Timername, $3:Time_WE\
) ## TPL_set_temp\
\
## Generierung der Steuerung pro Raum mit Hilfe des obigen Templates\
FOR(@{$_Timer},TPL_set_temp($1,[$SELF:$_],[$SELF:$1_WE]))
attr di_Therm room Heizung
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 (@{$_Timer},"$1"|)""\
""|""|"Arbeitstage"|FOR (@{$_Timer},WID([$SELF:$1],"time")|)""\
""|""|"Wochenende"|FOR (@{$_Timer},WID([$SELF:$1_WE],"time")|)""\
FOR (@{$_sc},("$1$1"|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:onoff:col1d],0,5,0,0,"I-O",\&onoff_hue,"0,,fill:silver")|"modus:".widget([$SELF:$1$1_mode],"select,auto,off"),,"aktuell:".widget([$1$2:desired-temp],"selectnumbers,18,0.5,22,1,lin","set")|FOR(@{$_Timer},("AT: ".widget([$SELF:$1$1_temp_at_$2],"selectnumbers,18,0.5,22,1,lin"),,"WE: ".widget([$SELF:$1$1_temp_we_$2],"selectnumbers,18,0.5,22,1,lin")|))""))

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FHEM-User22

Hallo Damian,
Du bist ja der Wahnsinn....
Dankeschön für Deine Arbeit.

Ich bin zwar noch dabei rauszusuchen, was ich auf meine Anlage umstricken muss, aber das werde ich auch schaffen.
Für Nichtkönner wie mich wäre es interessant, die "Variablen" zu wissen, eventuell sogar gebündelt an einer Stelle, die man aufs eigene System (z.B. die Devices, Readings, usw) anpassen muss. Der Code ist ja inzwischen so umfangreich geworden und viele Zeilen braucht man ja gar nicht anzufassen.

Beste Grüße
FHEM auf Raspberry Pi und Proxmox und... und.... und....