FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Krottbacher am 09 November 2021, 18:00:09

Titel: [gelöst]Steuerung mehrere Räume m. GUI für MAX-Heizkörperthermostate aus d. WIKI
Beitrag von: Krottbacher am 09 November 2021, 18:00:09
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","")|)"")]
Titel: Antw:Steuerung mehrere Räume mit GUI für MAX-Heizkörperthermostate aus dem WIKI
Beitrag von: Damian am 09 November 2021, 18:18:36
Poste mal die Raw-Definition, damit ich deine Definition bei mir ausprobieren kann.
Titel: Antw:Steuerung mehrere Räume mit GUI für MAX-Heizkörperthermostate aus dem WIKI
Beitrag von: Krottbacher am 09 November 2021, 18:29:06
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

Titel: Antw:Steuerung mehrere Räume mit GUI für MAX-Heizkörperthermostate aus dem WIKI
Beitrag von: Damian am 09 November 2021, 19:03:15
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);;\
...

Titel: Antw:Steuerung mehrere Räume mit GUI für MAX-Heizkörperthermostate aus dem WIKI
Beitrag von: Damian am 09 November 2021, 19:13:00
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",""))
Titel: Antw:Steuerung mehrere Räume mit GUI für MAX-Heizkörperthermostate aus dem WIKI
Beitrag von: Krottbacher am 09 November 2021, 19:21:26
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.  :)