DOIF + sub um das Gerät via Parameter zu bestimmen.

Begonnen von peter_w, 06 Juni 2022, 20:28:55

Vorheriges Thema - Nächstes Thema

peter_w

Hallo zusammen,

ich möchte 3 Trockner nach bedarf im Haus in verschiedenen Räumen aufstellen. Bisher hatte ich das mit DOIF im "nicht Perl Modus" erledigt, was aber zu sehr ähnlichen DOIF Geräten führte. Ich habe nun angefangen mich in den Perl modus zu vergraben stosse aber ein meine Grenzen. Die GUI funktionier schon wie gewünscht.
In der GUI kann ich den Raum auswählen wo der Trockkner stehen soll. Jetzt bin ich an der Stelle wo ich zum Raum passend zwei Dinge auswählen will: Einen Fensterkontakt und einen Luftfeuchtesensor.

Ich hatte gehofft man könnte das mit einer Unterfunktion wie sub myroom2window { erledigen.
Dazu zwei Fragen: Kann die Unterfunktion einen Wert rzurückliefern ? Kann ich den Wert dann in einem Template als Device verwenden ?
Also sowas wie: elsif([myroom2window($1)] eq "open")
Was nicht funktioniert ist eine Zuordnung über Raumnamen, da die Fenster z.b. auch im Nachbarraum sein können.  Deshalb hätte ich gerne eine Funktion.

Hier mal das Ganze was ich bisher geschafft habe:

Internals:
   .AttrList  disable:0,1 loglevel:0,1,2,3,4,5,6 notexist checkReadingEvent:0,1 addStateEvent:1,0 weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiState:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading
   DEF        subs{
## create one entry for each dehumififier name and the switch to enabe/disable it
push (@{$_sc},["T1","K_Dehumid3"]); ## AZ_Schalter
push (@{$_sc},["T2","K_Dehumid2"]); ## AZSTL_PSwitch_Sw K_Dehumid2
push (@{$_sc},["T3","K_Dehumid3"]);

## init all created readings and set default values
if ($::init_done) {
fhem("deletereading $SELF .*");
set_State("initialized");
for (my $i=0;$i < @{$_sc};$i++) {
set_Reading ($_sc[$i][0]."_MyRoom","Idi");
      set_Reading ($_sc[$i][0]."_Status","-");
  set_Reading ($_sc[$i][0]."_MyMode","Auto");
set_Reading ($_sc[$i][0]."_MinVal",52);
set_Reading ($_sc[$i][0]."_MedVal",54);
set_Reading ($_sc[$i][0]."_MaxVal",57);
  }
} ## end init

## Function to select the window contact for the selected room ## klappt noch nicht
sub myroom2window {
  my ($room,$trockner) = @_;
  set_State("xxx R=$room T=$trockner ");
if ($room eq "Idi") {
set_Reading($trockner."_Fenster","GZ_Fensterkontakt");
}
elsif($room eq "Bad") {
set_Reading($trockner."_Fenster","AT_Fensterkontakt");
}
elsif($room eq "Musikzimmer") {
set_Reading($trockner."_Fenster","AT_Fensterkontakt");
}
##case "Waschkueche" { set_Reading($trockner."_Fenster","KWK_Fensterkontakt") }
##case "Werkstatt" { set_Reading($trockner."_Fenster","-") }
  ##}
    return("AZ_Schalter");
} ## end sub myroom2window

}  ## end subs


## Template für den Trokner  https://wiki.fhem.de/wiki/DOIF/Perl-Modus
## $1=Trokner ID   $2=Schalter für Trockner  $3=Name der Statusvariablen
DEF TPL_TR(
{
if([Abwesend] eq "ja"){   # No one at home, disable
fhem_set("$2 off");   # switch fehumidifier off
set_Reading("$3","Abwesend"); # write a reading with the current state for the dehumidifier
}
elsif([$SELF:$1_MyMode] eq "On"){  ## manual enable
fhem_set("$2 on");   # Manual
set_Reading("$3","Fix On");
}
elsif([$SELF:$1_MyMode] eq "Off"){ ## manual disable
fhem_set("$2 off");   
set_Reading("$3","Fix Off");
}
elsif([$SELF:$1_MyMode] eq "Auto"){ ## automatic mode
   
##set_Reading(myroom2window($1,$1_MyRoom)." on");
   
}
}
)  ## end of TPL_TR

## $1 = Trokner / $2 = Schalter für Trockner / $3 = Name der Statusvariablen
## Schleife über alle Trockner
FOR (@{$_sc},TPL_TR($_$1,$_$2,$_$1.Status))

   FUUID      6297906e-f33f-9f5a-a1ad-9734e095088eb8b7
   MODEL      Perl
   NAME       RollStrg
   NOTIFYDEV  RollStrg,global,Abwesend
   NR         1174
   NTFY_ORDER 50-RollStrg
   STATE      initialized
   TYPE       DOIF
   VERSION    26020 2022-05-03 16:28:02
   eventCount 293
   .attraggr:
   .attrminint:
   Helper:
     DBLOG:
       state:
         logdb:
           TIME       1654539134.59275
           VALUE      initialized
   OLDREADINGS:
   READINGS:
     2022-06-06 20:12:14   T1_MaxVal       57
     2022-06-06 20:12:14   T1_MedVal       54
     2022-06-06 20:12:14   T1_MinVal       52
     2022-06-06 20:12:14   T1_MyMode       Auto
     2022-06-06 20:12:14   T1_MyRoom       Idi
     2022-06-06 20:12:14   T1_Status       -
     2022-06-06 20:12:14   T2_MaxVal       57
     2022-06-06 20:12:14   T2_MedVal       54
     2022-06-06 20:12:14   T2_MinVal       52
     2022-06-06 20:12:14   T2_MyMode       Auto
     2022-06-06 20:12:14   T2_MyRoom       Idi
     2022-06-06 20:12:14   T2_Status       -
     2022-06-06 20:12:14   T3_MaxVal       57
     2022-06-06 20:12:14   T3_MedVal       54
     2022-06-06 20:12:14   T3_MinVal       52
     2022-06-06 20:12:14   T3_MyMode       Auto
     2022-06-06 20:12:14   T3_MyRoom       Idi
     2022-06-06 20:12:14   T3_Status       -
     2022-06-06 20:12:14   state           initialized
   Regex:
     accu:
     collect:
     cond:
       Abwesend:
         0:
           &STATE     ^Abwesend$
         1:
           &STATE     ^Abwesend$
         2:
           &STATE     ^Abwesend$
       RollStrg:
         0:
           T1_MyMode  ^RollStrg$:^T1_MyMode:
         1:
           T2_MyMode  ^RollStrg$:^T2_MyMode:
         2:
           T3_MyMode  ^RollStrg$:^T3_MyMode:
     uiTable:
       RollStrg:
         RollStrg_uiTable_c_1_1_0_0:
           T1__MyRoom ^RollStrg$:^T1__MyRoom:
         RollStrg_uiTable_c_1_2_0_0:
           T1_MyMode  ^RollStrg$:^T1_MyMode:
         RollStrg_uiTable_c_1_3_0_0:
           T1__MinVal ^RollStrg$:^T1__MinVal:
         RollStrg_uiTable_c_1_4_0_0:
           T1__MedVal ^RollStrg$:^T1__MedVal:
         RollStrg_uiTable_c_1_5_0_0:
           T1__MaxVal ^RollStrg$:^T1__MaxVal:
         RollStrg_uiTable_c_2_1_0_0:
           T2__MyRoom ^RollStrg$:^T2__MyRoom:
         RollStrg_uiTable_c_2_2_0_0:
           T2_MyMode  ^RollStrg$:^T2_MyMode:
         RollStrg_uiTable_c_2_3_0_0:
           T2__MinVal ^RollStrg$:^T2__MinVal:
         RollStrg_uiTable_c_2_4_0_0:
           T2__MedVal ^RollStrg$:^T2__MedVal:
         RollStrg_uiTable_c_2_5_0_0:
           T2__MaxVal ^RollStrg$:^T2__MaxVal:
         RollStrg_uiTable_c_3_1_0_0:
           T3__MyRoom ^RollStrg$:^T3__MyRoom:
         RollStrg_uiTable_c_3_2_0_0:
           T3_MyMode  ^RollStrg$:^T3_MyMode:
         RollStrg_uiTable_c_3_3_0_0:
           T3__MinVal ^RollStrg$:^T3__MinVal:
         RollStrg_uiTable_c_3_4_0_0:
           T3__MedVal ^RollStrg$:^T3__MedVal:
         RollStrg_uiTable_c_3_5_0_0:
           T3__MaxVal ^RollStrg$:^T3__MaxVal:
   attr:
     cmdState:
   condition:
     0         
if(::InternalDoIf($hash,'Abwesend','STATE') eq "ja"){   # No one at home, disable
fhem_set("K_Dehumid3 off");   # switch fehumidifier off
set_Reading("T1.Status","Abwesend"); # write a reading with the current state for the dehumidifier
}
elsif(::ReadingValDoIf($hash,'RollStrg','T1_MyMode') eq "On"){    fhem_set("K_Dehumid3 on");   # Manual
set_Reading("T1.Status","Fix On");
}
elsif(::ReadingValDoIf($hash,'RollStrg','T1_MyMode') eq "Off"){ fhem_set("K_Dehumid3 off");   
set_Reading("T1.Status","Fix Off");
}
elsif(::ReadingValDoIf($hash,'RollStrg','T1_MyMode') eq "Auto"){     
   
}

     1         
if(::InternalDoIf($hash,'Abwesend','STATE') eq "ja"){   # No one at home, disable
fhem_set("K_Dehumid2 off");   # switch fehumidifier off
set_Reading("T2.Status","Abwesend"); # write a reading with the current state for the dehumidifier
}
elsif(::ReadingValDoIf($hash,'RollStrg','T2_MyMode') eq "On"){    fhem_set("K_Dehumid2 on");   # Manual
set_Reading("T2.Status","Fix On");
}
elsif(::ReadingValDoIf($hash,'RollStrg','T2_MyMode') eq "Off"){ fhem_set("K_Dehumid2 off");   
set_Reading("T2.Status","Fix Off");
}
elsif(::ReadingValDoIf($hash,'RollStrg','T2_MyMode') eq "Auto"){     
   
}

     2         
if(::InternalDoIf($hash,'Abwesend','STATE') eq "ja"){   # No one at home, disable
fhem_set("K_Dehumid3 off");   # switch fehumidifier off
set_Reading("T3.Status","Abwesend"); # write a reading with the current state for the dehumidifier
}
elsif(::ReadingValDoIf($hash,'RollStrg','T3_MyMode') eq "On"){    fhem_set("K_Dehumid3 on");   # Manual
set_Reading("T3.Status","Fix On");
}
elsif(::ReadingValDoIf($hash,'RollStrg','T3_MyMode') eq "Off"){ fhem_set("K_Dehumid3 off");   
set_Reading("T3.Status","Fix Off");
}
elsif(::ReadingValDoIf($hash,'RollStrg','T3_MyMode') eq "Auto"){     
   
}

   defs:
     tpl:
       TPL_TR     
{
if([Abwesend] eq "ja"){   # No one at home, disable
fhem_set("$2 off");   # switch fehumidifier off
set_Reading("$3","Abwesend"); # write a reading with the current state for the dehumidifier
}
elsif([RollStrg:$1_MyMode] eq "On"){    fhem_set("$2 on");   # Manual
set_Reading("$3","Fix On");
}
elsif([RollStrg:$1_MyMode] eq "Off"){ fhem_set("$2 off");   
set_Reading("$3","Fix Off");
}
elsif([RollStrg:$1_MyMode] eq "Auto"){     
   
}
}

   helper:
     NOTIFYDEV  RollStrg,global,Abwesend
     globalinit 1
     last_timer 0
     sleeptimer -1
   internals:
     all         Abwesend:STATE
   perlblock:
     0          block_01
     1          block_02
     2          block_03
   readings:
     all         RollStrg:T1_MyMode RollStrg:T2_MyMode RollStrg:T3_MyMode
   uiState:
   uiTable:
     dev        RollStrg
     header     
<table uitabid='DOIF-RollStrg' class=' block wide uiTabledoif doif-RollStrg ' style='border-top:none;width:70%;; height:80%;;'>
     package    package ui_Table;
     reading    T3__MaxVal
     shownostate 1
     tablestyle width:70%;; height:80%;;
     table:
       0:
         0:
           0:
             0          package ui_Table;"Trockner"
         1:
           0:
             0          package ui_Table;"Raum"
         2:
           0:
             0          package ui_Table;"Betriebsart"
         3:
           0:
             0          package ui_Table;"Min"
         4:
           0:
             0          package ui_Table;"Med"
         5:
           0:
             0          package ui_Table;"Max"
       1:
         0:
           0:
             0          package ui_Table;"T1"
         1:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'RollStrg_uiTable_c_1_1_0_0',::ReadingValDoIf($hash,'RollStrg','T1__MyRoom'),"",$hash->{uiTable}{template}{room},'','RollStrg','T1__MyRoom')
         2:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'RollStrg_uiTable_c_1_2_0_0',::ReadingValDoIf($hash,'RollStrg','T1_MyMode'),"",$hash->{uiTable}{template}{opmode},'','RollStrg','T1_MyMode')
         3:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'RollStrg_uiTable_c_1_3_0_0',::ReadingValDoIf($hash,'RollStrg','T1__MinVal'),"",$hash->{uiTable}{template}{humidity}.",fgColor:green",'','RollStrg','T1__MinVal')
         4:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'RollStrg_uiTable_c_1_4_0_0',::ReadingValDoIf($hash,'RollStrg','T1__MedVal'),"",$hash->{uiTable}{template}{humidity}.",fgColor:blue",'','RollStrg','T1__MedVal')
         5:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'RollStrg_uiTable_c_1_5_0_0',::ReadingValDoIf($hash,'RollStrg','T1__MaxVal'),"",$hash->{uiTable}{template}{humidity}.",fgColor:red",'','RollStrg','T1__MaxVal')
       2:
         0:
           0:
             0          package ui_Table;"T2"
         1:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'RollStrg_uiTable_c_2_1_0_0',::ReadingValDoIf($hash,'RollStrg','T2__MyRoom'),"",$hash->{uiTable}{template}{room},'','RollStrg','T2__MyRoom')
         2:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'RollStrg_uiTable_c_2_2_0_0',::ReadingValDoIf($hash,'RollStrg','T2_MyMode'),"",$hash->{uiTable}{template}{opmode},'','RollStrg','T2_MyMode')
         3:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'RollStrg_uiTable_c_2_3_0_0',::ReadingValDoIf($hash,'RollStrg','T2__MinVal'),"",$hash->{uiTable}{template}{humidity}.",fgColor:green",'','RollStrg','T2__MinVal')
         4:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'RollStrg_uiTable_c_2_4_0_0',::ReadingValDoIf($hash,'RollStrg','T2__MedVal'),"",$hash->{uiTable}{template}{humidity}.",fgColor:blue",'','RollStrg','T2__MedVal')
         5:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'RollStrg_uiTable_c_2_5_0_0',::ReadingValDoIf($hash,'RollStrg','T2__MaxVal'),"",$hash->{uiTable}{template}{humidity}.",fgColor:red",'','RollStrg','T2__MaxVal')
       3:
         0:
           0:
             0          package ui_Table;"T3"
         1:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'RollStrg_uiTable_c_3_1_0_0',::ReadingValDoIf($hash,'RollStrg','T3__MyRoom'),"",$hash->{uiTable}{template}{room},'','RollStrg','T3__MyRoom')
         2:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'RollStrg_uiTable_c_3_2_0_0',::ReadingValDoIf($hash,'RollStrg','T3_MyMode'),"",$hash->{uiTable}{template}{opmode},'','RollStrg','T3_MyMode')
         3:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'RollStrg_uiTable_c_3_3_0_0',::ReadingValDoIf($hash,'RollStrg','T3__MinVal'),"",$hash->{uiTable}{template}{humidity}.",fgColor:green",'','RollStrg','T3__MinVal')
         4:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'RollStrg_uiTable_c_3_4_0_0',::ReadingValDoIf($hash,'RollStrg','T3__MedVal'),"",$hash->{uiTable}{template}{humidity}.",fgColor:blue",'','RollStrg','T3__MedVal')
         5:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'RollStrg_uiTable_c_3_5_0_0',::ReadingValDoIf($hash,'RollStrg','T3__MaxVal'),"",$hash->{uiTable}{template}{humidity}.",fgColor:red",'','RollStrg','T3__MaxVal')
     tc:
       0          style='padding-left: 2px;; padding-right: 2px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'
       1          style='padding-left: 2px;; padding-right: 2px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'
       2          style='padding-left: 2px;; padding-right: 2px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'
       3          style='padding-left: 2px;; padding-right: 2px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'
       4          style='padding-left: 2px;; padding-right: 2px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'
       5          style='padding-left: 2px;; padding-right: 2px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'
       6          style='padding-left: 2px;; padding-right: 2px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'
     td:
       0:
         1          text-align: center;;
         2          text-align: center;;
         3          text-align: center;;
       1:
         1          text-align: center;;
         2          text-align: center;;
         3          text-align: center;;
       2:
         1          text-align: center;;
         2          text-align: center;;
         3          text-align: center;;
       3:
         1          text-align: center;;
         2          text-align: center;;
         3          text-align: center;;
       4:
         1          text-align: center;;
         2          text-align: center;;
         3          text-align: center;;
       5:
         1          text-align: center;;
         2          text-align: center;;
         3          text-align: center;;
       6:
         1          text-align: center;;
         2          text-align: center;;
         3          text-align: center;;
     template:
       humidity   knob,min:45,max:70,width:50,height:50,step:1,angleArc:270,angleOffset:225,lineCap:round,cursor:3,thickness:.3,bgColor:#808080
       opmode     Auto,On,Off
       room       Idi,Bad,Musikzimmer,Waschkueche,Werkstatt
     tpl:
       TPL_Trockner "$1"|WID([RollStrg:$1__MyRoom],$hash->{uiTable}{template}{room})|WID([RollStrg:$1_MyMode],$hash->{uiTable}{template}{opmode})|WID([RollStrg:$1__MinVal],$hash->{uiTable}{template}{humidity}.",fgColor:green")|WID([RollStrg:$1__MedVal],$hash->{uiTable}{template}{humidity}.",fgColor:blue")|WID([RollStrg:$1__MaxVal],$hash->{uiTable}{template}{humidity}.",fgColor:red")
     tr:
   var:
     sc:
       ARRAY(0x6c0bda8)
       ARRAY(0x7735f10)
       ARRAY(0x7b0d0d8)
Attributes:
   checkReadingEvent 1
   do         always
   room       Luftfeuchte Keller,x_DoIf
   uiTable    ## optionaler perl block um das Layout zu beeinflussen
{
  ## Die Detailansicht wird umorganisiert, hilfreich beim Editieren längerer uiTable-Definitionen
  ##$ATTRIBUTESFIRST=1;
 
  #### Ausblenden des Status in der Statuszeile
  $SHOWNOSTATE=1;
 
  ##Die Gerätezeile wird ausgeblendet in allen Räumen
  ## $SHOWNODEVICELINE = ".*";
 
  ##https://wiki.fhem.de/wiki/DOIF/uiTable
  ## Kombination von WID und STY
  ## uiTable Templates:  $TPL{<name>}="<template content>"
  $TPL{room} = "Idi,Bad,Musikzimmer,Waschkueche,Werkstatt";
  $TPL{opmode} = "Auto,On,Off";
 
  $TPL{humidity} = "knob,min:45,max:70,width:50,height:50,step:1,angleArc:270,angleOffset:225,lineCap:round,cursor:3,thickness:.3,bgColor:#808080";
 
  package ui_Table;
  $TABLE = "width:70%;; height:80%;;";
  $TC{0..6}="style='padding-left: 2px;; padding-right: 2px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'";
  $TD{0..6}{1..3}="text-align: center;;";
 
}

## Optionale Template definition
DEF TPL_Trockner("$1"|WID([$SELF:$1__MyRoom],$TPL{room})|WID([$SELF:$1_MyMode],$TPL{opmode})|WID([$SELF:$1__MinVal],$TPL{humidity}.",fgColor:green")|WID([$SELF:$1__MedVal],$TPL{humidity}.",fgColor:blue")|WID([$SELF:$1__MaxVal],$TPL{humidity}.",fgColor:red"))
##
## Tabellendefinition
##
"Trockner"|"Raum"|"Betriebsart"|"Min"|"Med"|"Max"
FOR(split(",","T1,T2,T3"),TPL_Trockner($_))
Release  : 5.8
Raspberry Pi 3
CUL V 1.63 CSM868 HomeMatic (SCC)
HM-CC-RT-DN,HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-SCo,HM-WDS10-TH-O

Damian

Also über Templates kannst du mehrere gleichartige Abläufe definieren. Allerdings werden bereits bei der Definition Platzhalter $1, $2 usw. gegen bestimmte Namen ersetzt.

Wenn also irgendwo [$1] als Trigger vorkommt, dann ist er zwar im Template variabel, aber spätestens nach der Definition fest und zur Laufzeit nicht änderbar, also nur über Neudefinition des DOIF-Devices mit defmod.

Das würde bedeuten, dass du nicht zur Laufzeit deine Szenarien ändern kannst, ohne das Device über defmod anzupassen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Zur Not kannst du ja alle Zimmer triggern lassen und erst im 2. Schritt die Richtigen rausfiltern.