Hi,
ich habe ein FHEM2FHEM eingerichtet. Das entfernte FHEM liefert mir auf mein lokales FHEM folgende EVENTS:
2018-11-03 23:32:14.494 OWCOUNT OWX_1D_18DC84000003 A: 78750.00 cts A_r: 0.00 cts/s B: 161300118.00 cts B_r: 24.90 cts/s
2018-11-03 23:32:24.246 OWCOUNT OWX_1D_18DC84000003 A: 78750
2018-11-03 23:32:24.269 OWCOUNT OWX_1D_18DC84000003 A_rate: 0
2018-11-03 23:32:24.292 OWCOUNT OWX_1D_18DC84000003 B: 161300373
2018-11-03 23:32:24.371 OWCOUNT OWX_1D_18DC84000003 B_rate: 25.2085868560355
2018-11-03 23:32:24.394 OWCOUNT OWX_1D_18DC84000003 memory:
2018-11-03 23:32:24.419 OWCOUNT OWX_1D_18DC84000003 A: 78750.00 cts A_r: 0.00 cts/s B: 161300373.00 cts B_r: 25.50 cts/s
2018-11-03 23:32:34.245 OWCOUNT OWX_1D_18DC84000003 A: 78750
2018-11-03 23:32:34.268 OWCOUNT OWX_1D_18DC84000003 A_rate: 0
2018-11-03 23:32:34.291 OWCOUNT OWX_1D_18DC84000003 B: 161300625
2018-11-03 23:32:34.373 OWCOUNT OWX_1D_18DC84000003 B_rate: 25.2085719299501
2018-11-03 23:32:34.398 OWCOUNT OWX_1D_18DC84000003 memory:
2018-11-03 23:32:34.424 OWCOUNT OWX_1D_18DC84000003 A: 78750.00 cts A_r: 0.00 cts/s B: 161300625.00 cts B_r: 25.20 cts/s
2018-11-03 23:32:44.242 OWCOUNT OWX_1D_18DC84000003 A: 78750
2018-11-03 23:32:44.265 OWCOUNT OWX_1D_18DC84000003 A_rate: 0
2018-11-03 23:32:44.288 OWCOUNT OWX_1D_18DC84000003 B: 161300877
2018-11-03 23:32:44.365 OWCOUNT OWX_1D_18DC84000003 B_rate: 25.2335284793063
2018-11-03 23:32:44.388 OWCOUNT OWX_1D_18DC84000003 memory:
2018-11-03 23:32:44.415 OWCOUNT OWX_1D_18DC84000003 A: 78750.00 cts A_r: 0.00 cts/s B: 161300877.00 cts B_r: 25.20 cts/s
2018-11-03 23:32:54.241 OWCOUNT OWX_1D_18DC84000003 A: 78750
2018-11-03 23:32:54.264 OWCOUNT OWX_1D_18DC84000003 A_rate: 0
2018-11-03 23:32:54.287 OWCOUNT OWX_1D_18DC84000003 B: 161301129
2018-11-03 23:32:54.363 OWCOUNT OWX_1D_18DC84000003 B_rate: 25.2167506971068
2018-11-03 23:32:54.386 OWCOUNT OWX_1D_18DC84000003 memory:
2018-11-03 23:32:54.411 OWCOUNT OWX_1D_18DC84000003 A: 78750.00 cts A_r: 0.00 cts/s B: 161301129.00 cts B_r: 25.20 cts/s
2018-11-03 23:33:04.243 OWCOUNT OWX_1D_18DC84000003 A: 78750
2018-11-03 23:33:04.267 OWCOUNT OWX_1D_18DC84000003 A_rate: 0
2018-11-03 23:33:04.291 OWCOUNT OWX_1D_18DC84000003 B: 161301378
2018-11-03 23:33:04.371 OWCOUNT OWX_1D_18DC84000003 B_rate: 25.216721971581
2018-11-03 23:33:04.396 OWCOUNT OWX_1D_18DC84000003 memory:
2018-11-03 23:33:04.524 OWCOUNT OWX_1D_18DC84000003 A: 78750.00 cts A_r: 0.00 cts/s B: 161301378.00 cts B_r: 24.90 cts/s
2018-11-03 23:33:14.242 OWCOUNT OWX_1D_18DC84000003 A: 78750
2018-11-03 23:33:14.265 OWCOUNT OWX_1D_18DC84000003 A_rate: 0
2018-11-03 23:33:14.289 OWCOUNT OWX_1D_18DC84000003 B: 161301630
2018-11-03 23:33:14.365 OWCOUNT OWX_1D_18DC84000003 B_rate: 25.1919918674989
2018-11-03 23:33:14.388 OWCOUNT OWX_1D_18DC84000003 memory:
2018-11-03 23:33:14.412 OWCOUNT OWX_1D_18DC84000003 A: 78750.00 cts A_r: 0.00 cts/s B: 161301630.00 cts B_r: 25.20 cts/s
usw.
Dadurch möchte ich die Berechnung von verschiedenen Werten antriggern. Das ganze hab ich bereits per Notify am laufen, möchte aber interessehalber (und vielleicht zur Vereinfachung) das ganze per DOIF lösen.
Dafür habe ich folgendes DOIF geschrieben:
Internals:
CFGFN
DEF ([OWX_1D_18DC84000003:B_rate])(setreading $SELF rate 12)
MODEL FHEM
NAME DF_WMZ_HZG_main
NR 127520
NTFY_ORDER 50-DF_WMZ_HZG_main
STATE initialized
TYPE DOIF
DOIF_Readings:
RL (::ReadingValDoIf($hash,'RE_TEMP_RuecklaufHK','temperature'))
VL (::ReadingValDoIf($hash,'RE_TEMP_VorlaufHK','temperature'))
deltaT (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','VL')-::ReadingValDoIf($hash,'DF_WMZ_HZG_main','RL'))
literpromin (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','rate')*60)
literprosec (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','rate'))
power (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','rate')*3600*1.16*::ReadingValDoIf($hash,'DF_WMZ_HZG_main','deltaT'))
work (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','rate')*1.16*::ReadingSecDoIf('DF_WMZ_HZG_main','work'))
READINGS:
2018-11-03 23:34:34 Device OWX_1D_18DC84000003
2018-11-03 23:30:04 RL 25.19
2018-11-03 23:25:37 VL 26.69
2018-11-03 23:27:20 cmd 0
2018-11-03 23:30:04 deltaT 1.5
2018-11-03 23:15:23 literpromin 0
2018-11-03 23:23:57 literprosec A: 78750.00 cts A_r: 0.00 cts/s B: 161287523.00 cts B_r: 25.20 cts/s
2018-11-03 23:27:20 mode enabled
2018-11-03 23:15:23 power 0
2018-11-03 23:23:57 rate A: 78750.00 cts A_r: 0.00 cts/s B: 161287523.00 cts B_r: 25.20 cts/s
2018-11-03 23:27:20 state initialized
2018-11-03 23:15:23 work 0
Regex:
DOIF_Readings:
DF_WMZ_HZG_main:
deltaT:
RL ^DF_WMZ_HZG_main$:^RL:
VL ^DF_WMZ_HZG_main$:^VL:
literpromin:
rate ^DF_WMZ_HZG_main$:^rate:
literprosec:
rate ^DF_WMZ_HZG_main$:^rate:
power:
deltaT ^DF_WMZ_HZG_main$:^deltaT:
rate ^DF_WMZ_HZG_main$:^rate:
work:
rate ^DF_WMZ_HZG_main$:^rate:
work ^DF_WMZ_HZG_main$:^work:
RE_TEMP_RuecklaufHK:
RL:
temperature ^RE_TEMP_RuecklaufHK$:^temperature:
RE_TEMP_VorlaufHK:
VL:
temperature ^RE_TEMP_VorlaufHK$:^temperature:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'OWX_1D_18DC84000003','B_rate')
devices:
0 OWX_1D_18DC84000003
all OWX_1D_18DC84000003
do:
0:
0 setreading DF_WMZ_HZG_main rate 12
1:
helper:
DOIF_Readings_events
event A: 78750.00 cts A_r: 0.00 cts/s B: 161303647.00 cts B_r: 24.90 cts/s
globalinit 1
last_timer 0
sleeptimer -1
triggerDev OWX_1D_18DC84000003
triggerEvents:
A: 78750.00 cts A_r: 0.00 cts/s B: 161303647.00 cts B_r: 24.90 cts/s
triggerEventsState:
A: 78750.00 cts A_r: 0.00 cts/s B: 161303647.00 cts B_r: 24.90 cts/s
internals:
itimer:
readings:
0 OWX_1D_18DC84000003:B_rate
all OWX_1D_18DC84000003:B_rate
trigger:
uiState:
uiTable:
Attributes:
DOIF_Readings VL:([RE_TEMP_VorlaufHK:temperature]),
RL:([RE_TEMP_RuecklaufHK:temperature]),
deltaT:([$SELF:VL]-[$SELF:RL]),
power:([$SELF:rate]*3600*1.16*[$SELF:deltaT]),
work:([$SELF:rate]*1.16*[$SELF:work:sec]),
literprosec:([$SELF:rate]),
literpromin:([$SELF:rate]*60)
do always
room FHEM2FHEM,Heizung,_doif
Leider wird der Wert in DF_WMZ_HZG_main:rate nicht aktualisiert, wenn ein neues Event kommt.
Was mache ich hier falsch, bzw. was habe ich übersehen?
Danke für die Hilfe,
Stephan
Eher zufällig bin ich grade doch noch drauf gestoßen, dass das Event falsch angegeben war: im B_rate: hängt noch der Doppelpunkt mit dran.
So gehts jetzt:
Internals:
CFGFN
DEF ([OWX_1D_18DC84000003:"B_rate"])
({
my ($a1,$b1) = split(" ", "$EVENT");
fhem("setreading $SELF rate $b1");
})
MODEL FHEM
NAME DF_WMZ_HZG_main
NR 127520
NTFY_ORDER 50-DF_WMZ_HZG_main
STATE cmd_1
TYPE DOIF
DOIF_Readings:
RL (::ReadingValDoIf($hash,'RE_TEMP_RuecklaufHK','temperature'))
VL (::ReadingValDoIf($hash,'RE_TEMP_VorlaufHK','temperature'))
deltaT (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','VL')-::ReadingValDoIf($hash,'DF_WMZ_HZG_main','RL'))
literpromin (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','rate')*60)
literprosec (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','rate'))
power (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','rate')*3600*1.16*::ReadingValDoIf($hash,'DF_WMZ_HZG_main','deltaT'))
work (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','rate')*1.16*::ReadingSecDoIf('DF_WMZ_HZG_main','work'))
READINGS:
2018-11-03 23:50:14 Device OWX_1D_18DC84000003
2018-11-03 23:48:01 RL 25.25
2018-11-03 23:25:37 VL 26.69
2018-11-03 23:50:14 cmd 1
2018-11-03 23:50:14 cmd_event OWX_1D_18DC84000003
2018-11-03 23:50:14 cmd_nr 1
2018-11-03 23:48:01 deltaT 1.44
2018-11-03 23:50:14 e_OWX_1D_18DC84000003_events A: 78750.00 cts A_r: 0.00 cts/s B: 161327331.00 cts B_r: 25.50 cts/s
2018-11-03 23:50:14 literpromin 1508.02449099482
2018-11-03 23:50:14 literprosec 25.1337415165803
2018-11-03 23:48:25 mode enabled
2018-11-03 23:50:14 power 151140.246585465
2018-11-03 23:50:14 rate 25.1337415165803
2018-11-03 23:50:14 state cmd_1
2018-11-03 23:50:14 work 0
Regex:
DOIF_Readings:
DF_WMZ_HZG_main:
deltaT:
RL ^DF_WMZ_HZG_main$:^RL:
VL ^DF_WMZ_HZG_main$:^VL:
literpromin:
rate ^DF_WMZ_HZG_main$:^rate:
literprosec:
rate ^DF_WMZ_HZG_main$:^rate:
power:
deltaT ^DF_WMZ_HZG_main$:^deltaT:
rate ^DF_WMZ_HZG_main$:^rate:
work:
rate ^DF_WMZ_HZG_main$:^rate:
work ^DF_WMZ_HZG_main$:^work:
RE_TEMP_RuecklaufHK:
RL:
temperature ^RE_TEMP_RuecklaufHK$:^temperature:
RE_TEMP_VorlaufHK:
VL:
temperature ^RE_TEMP_VorlaufHK$:^temperature:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::EventDoIf('OWX_1D_18DC84000003',$hash,'B_rate',1)
devices:
0 OWX_1D_18DC84000003
all OWX_1D_18DC84000003
do:
0:
0 { my ($a1,$b1) = split(" ", "$EVENT"); fhem("setreading DF_WMZ_HZG_main rate $b1"); }
1:
helper:
DOIF_Readings_events
event A: 78750.00 cts A_r: 0.00 cts/s B: 161327331.00 cts B_r: 25.50 cts/s
globalinit 1
last_timer 0
sleeptimer -1
timerdev OWX_1D_18DC84000003
timerevent B_rate: 25.1337415165803
triggerDev OWX_1D_18DC84000003
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: OWX_1D_18DC84000003
state: cmd_1
timerevents:
B_rate: 25.1337415165803
timereventsState:
B_rate: 25.1337415165803
triggerEvents:
A: 78750.00 cts A_r: 0.00 cts/s B: 161327331.00 cts B_r: 25.50 cts/s
triggerEventsState:
A: 78750.00 cts A_r: 0.00 cts/s B: 161327331.00 cts B_r: 25.50 cts/s
internals:
itimer:
readings:
trigger:
all OWX_1D_18DC84000003
uiState:
uiTable:
Attributes:
DOIF_Readings VL:([RE_TEMP_VorlaufHK:temperature]),
RL:([RE_TEMP_RuecklaufHK:temperature]),
deltaT:([$SELF:VL]-[$SELF:RL]),
power:([$SELF:rate]*3600*1.16*[$SELF:deltaT]),
work:([$SELF:rate]*1.16*[$SELF:work:sec]),
literprosec:([$SELF:rate]),
literpromin:([$SELF:rate]*60)
do always
room FHEM2FHEM,Heizung,_doif
selftrigger all
Nochmal Verständnishalber:
in der Commandref steht:
ZitatIn der Bedingung und im Ausführungsteil werden die Schlüsselwörter $SELF durch den eigenen Namen des DOIF-Moduls, $DEVICE durch das aktuelle Device, $EVENT durch die passende Eventzeile, $EVENTS kommagetrennt durch alle Eventzeilen des Triggers ersetzt.
Entsprechend können Perl-Variablen in der DOIF-Bedingung ausgewertet werden, sie werden in Kleinbuchstaben geschrieben. Sie lauten: $device, $event, $events
Anscheinend werden die Perl-Variablen im Ausführungsteil allerdings ebenfalls GROSS geschrieben...
Grüße,
Stephan
Zitat von: abc2006 am 04 November 2018, 19:48:04
Nochmal Verständnishalber:
in der Commandref steht:
Anscheinend werden die Perl-Variablen im Ausführungsteil allerdings ebenfalls GROSS geschrieben...
Grüße,
Stephan
$EVENT ist keine Perl-Variable, es ist ein Ausdruck, der gnadenlos gegen eine Zeichenkette ersetzt wird, damit es auch auf der FHEM-Ebene funktioniert.
Dagegen ist $event eine echte Perlvariable, daher würde:
my ($a1,$b1) = split(" ", "$EVENT");
auch so funktionieren:
my ($a1,$b1) = split(" ", $event);
dagegen würde das nicht funktionieren:
my ($a1,$b1) = split(" ", $EVENT);
Hey,
danke für deine Antwort.
Ich denke, es ist wirklich ein Verständnisproblem.
Im Bedingungsteil kann ich schreiben ([FHEM-Modus-Device:FHEM-Modus-Reading]) oder ({Perl Modus}).
Im FHEM-Modus funktioniert $EVENT (weil ersetzt durch Zeichenkette), im Perl-Modus $event als echte variable (die die Zeichenkette beinhaltet).
Im Ausführungsteil habe ich aber doch ebenfalls ([FHEM-Modus-Device:FHEM-Modus-Reading]) oder ({Perl Modus}).
UUnd hier hätte ich erwartet, dass (so wie im FHEM-Modus ja $EVENT ersetzt wird) auch $event als perl-Variable zur Verfügung steht...
Zu deinem Code: das zweite Beispiel, bei dem du sagst, es würde auch funktionieren, hatte ich die Fehlermeldung "Vielleicht haben Sie vergessen, $event zu deklarieren?"
Bin grad auf arbeit, kanns nicht nachstellen. schau ich mir morgen nochmal an. Wenn du sagst, dass es funktionieren sollte, dann hab ich wahrscheinlich nen Fehler drin gehabt...
Danke für deine Erklärung, ich weiss auch nicht, warum ich mich in manchen Dingen soo schwer tue ...
Grüße,
Stephan
Hi Damian,
anbei nochmal ein list. Ich habe das "$EVENT" (inklusive "") gegen $event (ohne "") ersetzt.
Nun erhalte ich die Fehlermeldung, ob ich vergessen hätte, $event zu deklarieren. Siehe List.
Was mach ich verkehrt?
Danke und Grüße,
Stephan
Internals:
DEF ([OWX_1D_18DC84000003:"B_rate"])({
my ($a1,$b1) = split(" ", $event);
$b1 = $b1/52;
fhem("setreading $SELF rate $b1");
})
MODEL FHEM
NAME DF_WMZ_HZG_main
NR 829
NTFY_ORDER 50-DF_WMZ_HZG_main
STATE 2109
TYPE DOIF
DOIF_Readings:
RL (::ReadingValDoIf($hash,'RE_TEMP_RuecklaufHK','temperature'))
VL (::ReadingValDoIf($hash,'RE_TEMP_VorlaufHK','temperature'))
deltaT (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','VL')-::ReadingValDoIf($hash,'DF_WMZ_HZG_main','RL'))
literpromin (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','rate')*60)
literprosec (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','rate'))
p1 (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','rate')*3600*1.16*::ReadingValDoIf($hash,'DF_WMZ_HZG_main','deltaT'))
power (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','p1','','d0'))
work (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','rate')*1.16*::ReadingSecDoIf('DF_WMZ_HZG_main','work'))
READINGS:
2018-11-06 23:54:25 Device OWX_1D_18DC84000003
2018-11-06 23:36:09 RL 24.06
2018-11-06 23:52:43 VL 25.25
2018-11-06 23:54:25 cmd 1
2018-11-06 23:54:25 cmd_event OWX_1D_18DC84000003
2018-11-06 23:54:25 cmd_nr 1
2018-11-06 23:52:43 deltaT 1.19
2018-11-06 23:54:25 e_OWX_1D_18DC84000003_events A: 78899.00 cts A_r: 0.00 cts/s B: 167309575.00 cts B_r: 22.20 cts/s
2018-11-06 23:54:25 error { my ($a1,$b1) = split(" ", $event); $b1 = $b1/52; fhem("setreading DF_WMZ_HZG_main rate $b1"); }: Global symbol "$event" requires explicit package name (did you forget to declare "my $event"?) at (eval 1846470) line 1.
2018-11-06 23:54:05 literpromin 25.4616377606685
2018-11-06 23:54:05 literprosec 0.424360629344475
2018-11-06 23:54:12 mode enabled
2018-11-06 23:54:05 p1 2108.83468588961
2018-11-06 23:54:05 power 2109
2018-11-06 23:54:05 rate 0.424360629344475
2018-11-06 23:54:25 state cmd_1
2018-11-06 23:54:05 work 0
Regex:
DOIF_Readings:
DF_WMZ_HZG_main:
deltaT:
RL ^DF_WMZ_HZG_main$:^RL:
VL ^DF_WMZ_HZG_main$:^VL:
literpromin:
rate ^DF_WMZ_HZG_main$:^rate:
literprosec:
rate ^DF_WMZ_HZG_main$:^rate:
p1:
deltaT ^DF_WMZ_HZG_main$:^deltaT:
rate ^DF_WMZ_HZG_main$:^rate:
power:
p1 ^DF_WMZ_HZG_main$:^p1:
work:
rate ^DF_WMZ_HZG_main$:^rate:
work ^DF_WMZ_HZG_main$:^work:
RE_TEMP_RuecklaufHK:
RL:
temperature ^RE_TEMP_RuecklaufHK$:^temperature:
RE_TEMP_VorlaufHK:
VL:
temperature ^RE_TEMP_VorlaufHK$:^temperature:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::EventDoIf('OWX_1D_18DC84000003',$hash,'B_rate',1)
devices:
0 OWX_1D_18DC84000003
all OWX_1D_18DC84000003
do:
0:
0 { my ($a1,$b1) = split(" ", $event); $b1 = $b1/52; fhem("setreading DF_WMZ_HZG_main rate $b1"); }
1:
helper:
event A: 78899.00 cts A_r: 0.00 cts/s B: 167309575.00 cts B_r: 22.20 cts/s
globalinit 1
last_timer 0
sleeptimer -1
timerdev OWX_1D_18DC84000003
timerevent B_rate: 22.0670332944319
triggerDev OWX_1D_18DC84000003
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: OWX_1D_18DC84000003
error: { my ($a1,$b1) = split(" ", $event); $b1 = $b1/52; fhem("setreading DF_WMZ_HZG_main rate $b1"); }: Global symbol "$event" requires explicit package name (did you forget to declare "my $event"?) at (eval 1846470) line 1.
state: cmd_1
timerevents:
B_rate: 22.0670332944319
timereventsState:
B_rate: 22.0670332944319
triggerEvents:
A: 78899.00 cts A_r: 0.00 cts/s B: 167309575.00 cts B_r: 22.20 cts/s
triggerEventsState:
A: 78899.00 cts A_r: 0.00 cts/s B: 167309575.00 cts B_r: 22.20 cts/s
internals:
itimer:
readings:
trigger:
all OWX_1D_18DC84000003
uiState:
uiTable:
Attributes:
DOIF_Readings VL:([RE_TEMP_VorlaufHK:temperature]),
RL:([RE_TEMP_RuecklaufHK:temperature]),
deltaT:([$SELF:VL]-[$SELF:RL]),
p1:([$SELF:rate]*3600*1.16*[$SELF:deltaT]),
power:([$SELF:p1:d0]),
work:([$SELF:rate]*1.16*[$SELF:work:sec]),
literprosec:([$SELF:rate]),
literpromin:([$SELF:rate]*60)
do always
room FHEM2FHEM,Heizung,_doif
selftrigger all
stateFormat power