Hallo zusammen.
Ich bin ein Fan von DOIF und würde gerne das Automatisierungsbeispiel
Steuerung von Raumthermostaten für mehrere Räume mit GUI für MAX-Heizkörperthermostate aus dem Wiki nutzen.
https://wiki.fhem.de/wiki/DOIF/Automatisierung#Steuerung_von_Raumthermostaten_f.C3.BCr_mehrere_R.C3.A4ume_mit_GUI (https://wiki.fhem.de/wiki/DOIF/Automatisierung#Steuerung_von_Raumthermostaten_f.C3.BCr_mehrere_R.C3.A4ume_mit_GUI)
Ich habe versucht den Code auf meine MAX Heizkörperthermostate anzupassen.
Die Geräte heißen:
heizung_1og_kz_rechts
heizung_1og_buero
heizung_1og_kz_links
Ich habe Zeile 6 bis 7 entsprechend zusammen mit Raumangaben angepasst.
Außerdem habe ich das reading <desired-temp> in Zeile 25 in <desiredTemperature> geändert da es bei Max-Thermostate so heißt.
Im Attribut uiTable habe ich auch die Readingangabe <desired-temp> auf <desiredTemperature> und <measured-temp> auf <temperature> geändert.
Leider bekomme kein UI wie im Wiki-Screenshot angezeigt. Es werden nur die Überschriften angezeigt. Siehe mein Screenshot. Was muß ich noch anpassen um den Code nutzen zu können?
Hier ein List von meinem angepassten Code:
[Internals:
CFGFN
DEF ## Schaltzeitpunkte, Liste kann angepasst werden
@{$_Timer}= qw(morgens vormittags mittags nachmittags abends nachts);
@{$_Timer_default} = qw(05:00 09:00 13:00 16:00 20:00 23:00);
## Definition der Räume mit dazugehörigen Thermostaten, Angaben können zweilenweise erweitert werden
push (@{$_sc},[qw(Ankleidezimmer heizung_1og_kz_rechts)]);
push (@{$_sc},[qw(Buero heizung_1og_buero)]);
push (@{$_sc},[qw(Schlafzimmer heizung_1og_kz_links)]);
## Bei Initialisierung oder Änderung der Definition werden Timer-Readings und Temperatur-Readings erstellt und vorbelegt
if ($::init_done) {
fhem("deletereading $SELF .*");
for (my $j=0;$j<@{$_Timer};$j++) {
set_Reading($_Timer[$j],$_Timer_default[$j]);
set_Reading("$_Timer[$j]_WE",$_Timer_default[$j]);
for (my $i=0;$i < @{$_sc};$i++) {
set_Reading("$_sc[$i][0]_$_Timer[$j]","20");
}
}
}
sub temp_set { ## Routine zum Setzen der Vorgabetemperaturen aller Räume für einen Zeitpunkt
my ($timer)=@_;
for (my $i=0;$i< @{$_sc};$i++) {
fhem_set("$_sc[$i][1] desiredTemperature ".get_Reading ("$_sc[$i][0]_$timer"));
}
}
} ## subs
DEF TPL_set_temp ( ## Definition des Templates namens TPL_set_temp zum Setzen der Thermostat-Vorgabetemperatur
Timer_$1 { ## Parameter: $1:Timername, $2:Time_AT, $3:Time_WE
if ([$2|AT] or [$3|WE]) {
temp_set("$1");
}
}
) ## TPL_set_temp
## Generierung der Steuerung pro Raum mit Hilfe des obigen Templates
FOR(@{$_Timer},TPL_set_temp($1,[$SELF:$_],[$SELF:$1_WE]))
FUUID 6186aee2-f33f-f714-34fe-5a9d91e9455e25c1
MODEL Perl
NAME di_Thermostate
NOTIFYDEV global
NR 56215
NTFY_ORDER 50-di_Thermostate
STATE initialized
TYPE DOIF
VERSION 24905 2021-09-01 18:35:54
READINGS:
2021-11-09 17:16:13 mode enabled
2021-11-09 17:16:13 state initialized
Regex:
accu:
collect:
condition:
defs:
tpl:
TPL_set_temp Timer_$1 { if ([$2|AT] or [$3|WE]) {
temp_set("$1");
}
}
helper:
DEVFILTER ^global$
NOTIFYDEV global
globalinit 1
last_timer 0
sleeptimer -1
perlblock:
uiState:
uiTable:
header
<table uitabid='DOIF-di_Thermostate' class=' block wide uiTabledoif doif-di_Thermostate ' style='border-top:none;'>
package package ui_Table;
table:
0:
0:
0:
0 package ui_Table;"Zeitpunkt"
1:
0:
0 package ui_Table;"aktuell"
2:
0:
0 package ui_Table;"akt. Vorgabe"
3:
0:
0 package ui_Table;""
1:
0:
0:
0 package ui_Table;"Wochentags"
1:
0:
0 package ui_Table;" "
2:
0:
0 package ui_Table;" "
3:
0:
0 package ui_Table;""
2:
0:
0:
0 package ui_Table;"Wochenende"
1:
0:
0 package ui_Table;" "
2:
0:
0 package ui_Table;" "
3:
0:
0 package ui_Table;""
tc:
1 style='padding-left: 10px; padding-right: 10px; padding-top: 3px; padding-bottom: 3px;' align='center'
10 style='padding-left: 10px; padding-right: 10px; padding-top: 3px; padding-bottom: 3px;' align='center'
2 style='padding-left: 10px; padding-right: 10px; padding-top: 3px; padding-bottom: 3px;' align='center'
3 style='padding-left: 10px; padding-right: 10px; padding-top: 3px; padding-bottom: 3px;' align='center'
4 style='padding-left: 10px; padding-right: 10px; padding-top: 3px; padding-bottom: 3px;' align='center'
5 style='padding-left: 10px; padding-right: 10px; padding-top: 3px; padding-bottom: 3px;' align='center'
6 style='padding-left: 10px; padding-right: 10px; padding-top: 3px; padding-bottom: 3px;' align='center'
7 style='padding-left: 10px; padding-right: 10px; padding-top: 3px; padding-bottom: 3px;' align='center'
8 style='padding-left: 10px; padding-right: 10px; padding-top: 3px; padding-bottom: 3px;' align='center'
9 style='padding-left: 10px; padding-right: 10px; padding-top: 3px; padding-bottom: 3px;' align='center'
td:
0:
1:
2:
tr:
var:
Attributes:
room Heizung
uiTable {
package ui_Table;
$TC{1..10}="style='padding-left: 10px; padding-right: 10px; padding-top: 3px; padding-bottom: 3px;' align='center'";
}
"Zeitpunkt"|"aktuell"|"akt. Vorgabe"|FOR (@{$_Timer},"$1"|)""
"Wochentags"|" "|" "|FOR (@{$_Timer},WID([$SELF:$1],"time")|)""
"Wochenende"|" "|" "|FOR (@{$_Timer},WID([$SELF:$1_WE],"time")|)""FOR (@{$_sc},"$1$1"|temp_hum_ring([$1$2:temperature],[$1$2:humidity])|temp_knob([$1$2:desiredTemperature],"Darkorange","set")|FOR(@{$_Timer},temp_knob([$SELF:$1$1_$2],"Darkorange","")|)"")]
Poste mal die Raw-Definition, damit ich deine Definition bei mir ausprobieren kann.
Hallo Damian.
wie gewünscht die RAW Definition.
defmod di_Thermostate DOIF ## Schaltzeitpunkte, Liste kann angepasst werden \
@{$_Timer}= qw(morgens vormittags mittags nachmittags abends nachts);;\
@{$_Timer_default} = qw(05:00 09:00 13:00 16:00 20:00 23:00);;\
\
## Definition der Räume mit dazugehörigen Thermostaten, Angaben können zweilenweise erweitert werden\
push (@{$_sc},[qw(Ankleidezimmer heizung_1og_kz_rechts)]);;\
push (@{$_sc},[qw(Buero heizung_1og_buero)]);;\
push (@{$_sc},[qw(Schlafzimmer heizung_1og_kz_links)]);;\
\
## Bei Initialisierung oder Änderung der Definition werden Timer-Readings und Temperatur-Readings erstellt und vorbelegt\
if ($::init_done) {\
fhem("deletereading $SELF .*");;\
for (my $j=0;;$j<@{$_Timer};;$j++) {\
set_Reading($_Timer[$j],$_Timer_default[$j]);;\
set_Reading("$_Timer[$j]_WE",$_Timer_default[$j]);;\
for (my $i=0;;$i < @{$_sc};;$i++) {\
set_Reading("$_sc[$i][0]_$_Timer[$j]","20");;\
}\
}\
}\
\
sub temp_set { ## Routine zum Setzen der Vorgabetemperaturen aller Räume für einen Zeitpunkt\
my ($timer)=@_;;\
for (my $i=0;;$i< @{$_sc};;$i++) {\
fhem_set("$_sc[$i][1] desiredTemperature ".get_Reading ("$_sc[$i][0]_$timer"));;\
}\
}\
} ## subs\
\
DEF TPL_set_temp ( ## Definition des Templates namens TPL_set_temp zum Setzen der Thermostat-Vorgabetemperatur\
Timer_$1 { ## Parameter: $1:Timername, $2:Time_AT, $3:Time_WE\
if ([$2|AT] or [$3|WE]) {\
temp_set("$1");;\
}\
}\
) ## 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_Thermostate room Heizung
attr di_Thermostate uiTable {\
package ui_Table;;\
$TC{1..10}="style='padding-left: 10px;; padding-right: 10px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'";;\
}\
\
"Zeitpunkt"|"aktuell"|"akt. Vorgabe"|FOR (@{$_Timer},"$1"|)""\
"Wochentags"|" "|" "|FOR (@{$_Timer},WID([$SELF:$1],"time")|)""\
"Wochenende"|" "|" "|FOR (@{$_Timer},WID([$SELF:$1_WE],"time")|)""\
FOR (@{$_sc},"$1$1"|temp_hum_ring([$1$2:temperature],[$1$2:humidity])|temp_knob([$1$2:desiredTemperature],"Darkorange","set")|FOR(@{$_Timer},temp_knob([$SELF:$1$1_$2],"Darkorange","")|)"")
setstate di_Thermostate initialized
setstate di_Thermostate 2021-11-09 17:16:13 mode enabled
setstate di_Thermostate 2021-11-09 17:16:13 state initialized
Im Wiki fehlte die erste Zeile der Definition - ich habe es gerade dort korrigiert.
Es muss anfangen mit:
defmod di_Thermostate DOIF subs {\
## Schaltzeitpunkte, Liste kann angepasst werden \
@{$_Timer}= qw(morgens vormittags mittags nachmittags abends nachts);;\
...
In der Praxis waren es mir dann doch zu viele Stellschrauben (Temperaturen), die man einstellen musste. Meine jetzige Version hat nur noch eine Vorgabetemperatur pro Raum, die außerhalb der Heizphase um 0.5 Grad (kann man im Code anpassen) reduziert wird.
defmod di_Thermostate DOIF subs {\
## Schaltzeitpunkte, Liste kann angepasst werden \
@{$_Timer}= qw(morgens vormittags nachmittags abends);;\
@{$_Timer_default} = qw(04:30 09:00 13:00 22:00);;\
\
## 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 .*");;\
for (my $j=0;;$j<@{$_Timer};;$j++) {\
set_Reading($_Timer[$j],$_Timer_default[$j]);;\
set_Reading("$_Timer[$j]_WE",$_Timer_default[$j]);;\
}\
for (my $i=0;;$i < @{$_sc};;$i++) {\
set_Reading("$_sc[$i][0]_temp","20");;\
}\
}\
\
sub temp_set {##Routine zum Setzen der Vorgabetemperaturen aller Räume für einen Zeitpunkt\
my ($timer)=@_;;\
for (my $i=0;;$i< @{$_sc};;$i++) {\
if ($timer eq "morgens" or $timer eq "nachmittags") {\
fhem_set("$_sc[$i][1] desired-temp ".get_Reading ("$_sc[$i][0]_temp"));;\
} else {\
fhem_set("$_sc[$i][1] desired-temp ".(get_Reading ("$_sc[$i][0]_temp")-0.5));;\
}\
}\
}\
} ## subs\
\
DEF TPL_set_temp ( ## Definition des Templates namens TPL_set_temp zum Setzen der Thermostat-Vorgabetemperatur\
Timer_$1 { ## DOIF Block\
##Parameter $1 $2 $3 \
##Bedeutung Timer Time Time_WE\
if ([$2|AT] or [$3|WE]) {\
temp_set("$1");;\
}\
}\
) ## TPL_set_temp\
\
## Generierung der Steuerung pro Beschattung-Szene mit Hilfe des obigen Templates\
FOR(@{$_Timer},TPL_set_temp($1,[$SELF:$1],[$SELF:$1_WE]))
attr di_Thermostate room Heizung
attr di_Thermostate uiTable {\
package ui_Table;;\
$TC{1..10}="style='padding-left: 2px;; padding-right: 2px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'";;\
}\
\
\
"Wochentags"|FOR (@{$_Timer},WID([$SELF:$1],"time")|)""\
"Wochenende"|FOR (@{$_Timer},WID([$SELF:$1_WE],"time")|)""<\
"Zeitpunkt"|"aktuell"|"akt. Vorgabe"|"Temperatur"\
FOR (@{$_sc},"$1$1"|temp_hum_ring([$1$2:measured-temp],[$1$2:humidity])|temp_knob([$1$2:desired-temp],"Darkorange","set")|temp_knob([$SELF:$1$1_temp],"Darkorange",""))
Hallo Damian.
das wars. Jetzt tut es auch bei mir. Vielen Dank für die Unterstützung.
Gruß Uwe
PS: Deine Small-Version werde ich mit bei Gelegenheit anschauen. Werde mich jetzt erst mal mit der WIKI Version beschäftigen. :)