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
Den Zusammenhang mit "Aggregieren" sehe ich nicht wirklich...
Kannst Du mal ein vollständiges "list" von deinem DOIF zeigen?
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
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.
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