DOIF Default Wert in "Aggregieren von Werten"

Begonnen von ahermann86, 29 Dezember 2019, 14:50:32

Vorheriges Thema - Nächstes Thema

ahermann86

Hallo,

ich versuche gerade ein DOIF mit "eigenen" Readings als Speicher/Merker zu verwenden.
Das funktioniert auch .. aber von dem "[<function>:<format>:"<regex device>:<regex event>":<reading>|"<regex reading>":<condition>,<default>]" komme ich mit dem <default> nicht klar.

Wenn ich die commandref richtig verstanden habe, müsste beides gleiches tun:

Variante 1:
my $oval = [$SELF:LstMode,"Standby"];

Variante2:
my $oval = ReadingsVal("$SELF","LstMode","Standby");

Dabei musste ich aber feststellen, dass nur Variante 2 funktioniert.

(Der Codeschnipsel ist im DOIF Ausführungsteil als Perl in {} geschrieben..)

Ist das ein Denkkfehler von mir oder ein Fehler im DOIF?

Gruß
Axel

amenomade

Den Zusammenhang mit "Aggregieren" sehe ich nicht wirklich...
Kannst Du mal ein vollständiges "list" von deinem DOIF zeigen?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

ahermann86

Das ist richtig, es steht in der commandref unter dieser Überschrift. Daher dieser Zusammenhang...

Das list hatte ich zunächst vorenthalten um niemenden zu verwirren aber nachfolgend das komplette List:



Internals:
   DEF        ([23:59])
()
DOELSEIF ([23:59] and (strftime ("%d",localtime time+86400) == 01))
()
DOELSEIF ([myHPSU:HPSU.Aktive_Betriebsart])
({
  my $etot = ReadingsNum("SDM72DM_Z1","Energy_total__kWh",0);
  my $etotstart = [$SELF:EtotStart,-1];
  my $val = ReadingsVal("myHPSU","HPSU.Aktive_Betriebsart","Standby");
  my $oval = ReadingsVal("$SELF","LstMode","Standby");

  fhem"setreading $SELF EtotStart $etot" if ($etotstart < 0);
  $etotstart = [$SELF:EtotStart,-1];
 
  if ($val ne $oval)
  {
    fhem"setreading $SELF EStandby {([$SELF:EStandby,0]+$etot-$etotstart)}" if ($oval eq "Standby");
    fhem"setreading $SELF EHeizen {([$SELF:EHeizen,0]+$etot-$etotstart)}" if ($oval eq "Heizen");
    fhem"setreading $SELF EKuehlen {([$SELF:EKuehlen,0]+$etot-$etotstart)}" if ($oval eq "Kuehlen");
    fhem"setreading $SELF EAbtauen {([$SELF:EAbtauen,0]+$etot-$etotstart)}" if ($oval eq "Abtauen");
    fhem"setreading $SELF EWarmW {([$SELF:EWarmW,0]+$etot-$etotstart)}" if ($oval eq "Warmwasserbereitung");
   
    fhem"setreading $SELF EtotStart $etot";
    fhem"setreading $SELF LstMode $val"; 
  }

  ##Log 1, "$etot $etotstart $val $oval";
})
   FUUID      5dbfe562-f33f-a47e-3d76-7006ae0670d623eb
   MODEL      FHEM
   NAME       diHPSU_Consumption
   NR         475
   NTFY_ORDER 50-diHPSU_Consumption
   STATE      cmd_3
   TYPE       DOIF
   VERSION    19303 2019-05-01 08:47:16
   OLDREADINGS:
   READINGS:
     2019-12-29 22:43:19   Device          myHPSU
     2019-12-29 21:16:40   EAbtauen        0.207999999999629
     2019-12-29 21:11:05   EHeizen         5.28200000000106
     2019-12-29 17:32:49   EStandby        0.430999999999585
     2019-12-29 21:16:40   EtotStart       7955.210
     2019-12-29 21:16:40   LstMode         Heizen
     2019-12-29 22:43:17   cmd             3
     2019-12-29 22:43:17   cmd_event       myHPSU
     2019-12-29 22:43:17   cmd_nr          3
     2019-12-29 22:43:17   e_myHPSU_HPSU.Aktive_Betriebsart Heizen
     2019-12-29 22:43:17   state           cmd_3
   Regex:
     accu:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)
     1          ::DOIF_time_once($hash,1,$wday) and (strftime ("%d",localtime time+86400) == 01)
     2          ::ReadingValDoIf($hash,'myHPSU','HPSU.Aktive_Betriebsart')
   days:
   devices:
     2           myHPSU
     all         myHPSU
   do:
     0:
       0         
     1:
       0         
     2:
       0          {   my $etot = ReadingsNum("SDM72DM_Z1","Energy_total__kWh",0);   my $etotstart = [diHPSU_Consumption:EtotStart,-1];   my $val = ReadingsVal("myHPSU","HPSU.Aktive_Betriebsart","Standby");   my $oval = ReadingsVal("diHPSU_Consumption","LstMode","Standby");    fhem"setreading diHPSU_Consumption EtotStart $etot" if ($etotstart < 0);   $etotstart = [diHPSU_Consumption:EtotStart,-1];      if ($val ne $oval)   {     fhem"setreading diHPSU_Consumption EStandby {([diHPSU_Consumption:EStandby,0]+$etot-$etotstart)}" if ($oval eq "Standby");     fhem"setreading diHPSU_Consumption EHeizen {([diHPSU_Consumption:EHeizen,0]+$etot-$etotstart)}" if ($oval eq "Heizen");     fhem"setreading diHPSU_Consumption EKuehlen {([diHPSU_Consumption:EKuehlen,0]+$etot-$etotstart)}" if ($oval eq "Kuehlen");     fhem"setreading diHPSU_Consumption EAbtauen {([diHPSU_Consumption:EAbtauen,0]+$etot-$etotstart)}" if ($oval eq "Abtauen");     fhem"setreading diHPSU_Consumption EWarmW {([diHPSU_Consumption:EWarmW,0]+$etot-$etotstart)}" if ($oval eq "Warmwasserbereitung");          fhem"setreading diHPSU_Consumption EtotStart $etot";     fhem"setreading diHPSU_Consumption LstMode $val";     }     }
     3:
   helper:
     event      HPSU.Heizung_Ruecklauf: 26.5 °C
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   myHPSU
     timerevent HPSU.Aktive_Betriebsart: Heizen
     triggerDev myHPSU
     DOIF_eventas:
       cmd_nr: 3
       cmd: 3
       cmd_event: myHPSU
       state: cmd_3
     timerevents:
       HPSU.Aktive_Betriebsart: Heizen
     timereventsState:
       HPSU.Aktive_Betriebsart: Heizen
     triggerEvents:
       HPSU.Heizung_Ruecklauf: 26.5 °C
     triggerEventsState:
       HPSU.Heizung_Ruecklauf: 26.5 °C
   internals:
   intervalfunc:
   itimer:
   localtime:
     0          1577660340
     1          1577660340
   powerMap:
   readings:
     2           myHPSU:HPSU.Aktive_Betriebsart
     all         myHPSU:HPSU.Aktive_Betriebsart
   readingsDesc:
     pM_consumption:
       rtype      w
     pM_energy:
       rtype      whr
   realtime:
     0          23:59:00
     1          23:59:00
   time:
     0          23:59:00
     1          23:59:00
   timeCond:
     0          0
     1          1
   timer:
     0          0
     1          0
   timers:
     0           0
     1           1
   trigger:
   triggertime:
     1577660340:
       localtime  1577660340
       hash:
   uiState:
   uiTable:
Attributes:
   do         always
   room       HPSU_Debug,Heizung_HPSU


Notiz: Das ganze soll den detallierten Energieverbrauch meiner Rotex HPSU Wärmepumpe ermitteln. Die ersten beiden Befehlszeilen sind absichtlich noch leer. Da kommt noch das tägliche und monatliche Schreiben der Verbräuche rein.

Gruß
Axel

Per

Zitat von: ahermann86 am 29 Dezember 2019, 14:50:32Ist das ein Denkkfehler von mir oder ein Fehler im DOIF?
Die erste Variante gibt
my $oval = Standby;
zurück (wenn nix in der LstMode steht), die Perl-Variante
my $oval = "Standby";
Um (hier) das Gleiche zurück zu bekommen, musst du
my $oval = "[$SELF:LstMode,'Standby']";
nutzen.

ahermann86

Zitat
Um (hier) das Gleiche zurück zu bekommen, musst du
Code: [Auswählen]

my $oval = "[$SELF:LstMode,'Standby']";

nutzen.

Hier mein Testcode für die Variante mit "". 


...
({
  my $oval = "[$SELF:LstMode,'Standby']";
   
  fhem"setreading $SELF LstMode $oval";
})
...


Das funktioniert so auch nicht. Da bekomme ich den Fehler:

error   Bad name after Standby' at (eval 6913020) line 1.   2020-01-02 23:41:53