Rückfrage zum Heizungssteuerungsbeispiel aus dem Wiki (DOIF)

Begonnen von hkspks, 06 Dezember 2024, 12:19:51

Vorheriges Thema - Nächstes Thema

hkspks

Hallo zusammen,

ich würde gerne folgendes Beispiel zur DOIF/ Automatisierung adaptieren:
https://wiki.fhem.de/wiki/DOIF/Automatisierung#Steuerung_von_Raumthermostaten_f%C3%BCr_mehrere_R%C3%A4ume_mit_GUI

Meine Anforderung: ich hätte die Arbeitstage noch gerne unterschieden nach Montag-Donnerstag und Freitag, also quasi 3 Pläne abhängig des Wochentages (anstatt 2).

Wo ich Nachhilfe benötige: woher weiß der Timer/ wo wird der Funktion mitgegeben, ob gerade Wochenende oder Arbeitstag ist. Das müsste ich ja dann ergänzen ob Montag - Donnerstag oder Freitag ist. Im Skript finde ich nur Benamungen WE bzw. AT für Wochenende und Arbeitstag.

Kann mir da jemand helfen?

Code aus dem Wiki:
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:state:col1d:$_ eq "on" ? 1:0],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")|))\
    ""\
  )\
)

Damian

Bei dieser Definition sind vier Zeitpunkte für die Vorgabe der Heiztemperatur vorgesehen. Es gibt lediglich eine Unterscheidung zwischen Arbeitstagen und Wochenende.

Wenn man weitere Unterscheidungen haben möchte, müsste man weitere Zeilen hinzufügen z. B.

für Montag
@{$_Timer_default_mo} = qw(05:30 09:00 13:00 22:00);;\
Allerdings muss man dann auch den Code danach anpassen mit dem Aufruf der jeweiligen Funktion und diese auch definieren:

z. B. für Montag
Timer_mo_$1 {[$2|Mo];;temp_mo_set("$1")}

Man sollte sich etwas in Perl auskennen und das Konzept von Templates in DOIF kennen.

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

hkspks

#2
Hallo Damian,

ich muss nochmal nachfragen, weil ich dazu wirklich Null in der Suchmaschine finde - sorry dafür!

Sind diese Kürzel "Mo" "AT" "WE" Steuerungsinformationen oder nur Variablen-/ Funktionsbenamung?

1) Falls das wirklich Steuerungsinformationen sind, kannst Du mir eine Doku nennen, wo ich dies nachlesen kann? Finde es dann verrückt, dass AT = Arbeitstag (also deutsch)
2) Falls es nur Benamung ist, woher weiß dann z.B. PERL, dass die Funktion nur am Montag ausgeführt werden soll?

Also ich bin wirklich bemüht, dass man mir das nicht alles vorkauen muss, aber ich komme da nicht weiter. Dank Dir!

Nobbynews

#3
Zitat von: hkspks am 06 Dezember 2024, 16:08:13ich muss nochmal nachfragen, weil ich dazu wirklich Null in der Suchmaschine finde - sorry dafür!

Sind diese Kürzel "Mo" "AT" "WE" Steuerungsinformationen oder nur Variablen-/ Funktionsbenamung?
Lesen der commandref oder mal die Hilfe aufrufen.....
https://fhem.de/commandref_DE.html#DOIF_Wochentagsteuerung

hkspks