Hallo,
ich stehe derzeit etwas auf dem Schlauch: Ich möchte ein DOIF generieren, welches drei Bedingungen abfragt:
- Zeitraum von/bis,
- Abfrage eines Readings und
- Abfrage einer Perl-Funktion (in myUtils)
Ich habe hierzu das folgende DOIF generiert:
define di.Reinigung DOIF ([08:00-18:00] and [rgr_Bewohner] eq "absent" and {KeineReinigungHeute()} eq "0") \
(set dmStaubsauger on)
Es hakt hier m. E. an der letzten Bedingung (lasse ich diese weg, funktioniert alles). Was kann ich machen, damit diese korrekt abgefragt wird?
Schon mal vielen Dank!
Viele Grüße
Michael
Hallo Michael,
zeig mal ein noch ein list von deinem DOIF. Da gibt es bestimmt ne Fehlermeldung.
Ich denke an der Stelle gehen keine Perlausdrücke. Dann muss Du DOIF im Perlmodus verwenden.
Gruß Otto
Ich tippe darauf (ungetestet):
define di.Reinigung DOIF ([08:00-18:00] and [rgr_Bewohner] eq "absent" and [{KeineReinigungHeute()}] eq "0") \
(set dmStaubsauger on)
Ansonsten im Perl-Modus:
define di.Reinigung DOIF {if ([08:00-18:00] and [rgr_Bewohner] eq "absent" and KeineReinigungHeute() eq "0") \
fhem_set dmStaubsauger on}
Hallo Otto,
Zitat von: Otto123 am 13 April 2020, 17:47:11
zeig mal ein noch ein list von deinem DOIF. Da gibt es bestimmt ne Fehlermeldung.
Ich denke an der Stelle gehen keine Perlausdrücke. Dann muss Du DOIF im Perlmodus verwenden.
hier mal das List:
DEF ([08:00-19:00] and [rgr_Bewohner] eq "absent" and {KeineReinigungHeute()} eq "0")
(set dmStaubsauger on)
FUUID 5ddebc84-f33f-966a-156c-2af97f38ab9f5fb9
MODEL FHEM
NAME di.Reinigung
NOTIFYDEV global,rgr_Bewohner
NR 344
NTFY_ORDER 50-di.Reinigung
STATE initialized
TYPE DOIF
VERSION 21224 2020-02-18 18:45:49
READINGS:
2020-04-13 18:07:47 cmd 0
2020-04-13 18:07:47 mode enabled
2020-04-13 18:07:47 state initialized
2020-04-13 18:07:47 timer_01_c01 14.04.2020 08:00:00
2020-04-13 18:07:47 timer_02_c01 13.04.2020 19:00:00
Regex:
accu:
cond:
rgr_Bewohner:
0:
&STATE ^rgr_Bewohner$
attr:
cmdState:
wait:
waitdel:
condition:
0 ::DOIF_time($hash,0,1,$wday,$hms) and ::InternalDoIf($hash,'rgr_Bewohner','STATE') eq "absent" and {KeineReinigungHeute()} eq "0"
days:
do:
0:
0 set dmStaubsauger on
1:
helper:
DEVFILTER ^global$|^rgr_Bewohner$
NOTIFYDEV global|rgr_Bewohner
globalinit 1
last_timer 2
sleeptimer -1
internals:
all rgr_Bewohner:STATE
interval:
0 -1
1 0
intervalfunc:
localtime:
0 1586844000
1 1586797200
realtime:
0 08:00:00
1 19:00:00
time:
0 08:00:00
1 19:00:00
timeCond:
0 0
1 0
timer:
0 0
1 0
timers:
0 0 1
triggertime:
1586797200:
localtime 1586797200
hash:
1586844000:
localtime 1586844000
hash:
uiState:
uiTable:
Attributes:
Ich habe jetzt mal den Perl-Modus ausprobiert, aber so zumindest auch noch keine Lösung erhalten:
define di.Reinigung DOIF {if ([08:00-19:00] and [rgr_Bewohner:"absent"] and [KeineReinigungHeute() eq "0"]) \
{fhem_set "dmStaubsauger on"}\
}\
Auch hier gibt's erst einmal keine Fehlermeldung:
DEF {if ([08:00-19:00] and [rgr_Bewohner:"absent"] and [KeineReinigungHeute() eq "0"])
{fhem_set "dmStaubsauger on"}
}
FUUID 5ddebc84-f33f-966a-156c-2af97f38ab9f5fb9
MODEL Perl
NAME di.Reinigung
NOTIFYDEV global,rgr_Bewohner
NR 344
NTFY_ORDER 50-di.Reinigung
STATE cmd_2
TYPE DOIF
VERSION 21224 2020-02-18 18:45:49
READINGS:
2020-04-13 18:21:08 Device rgr_Bewohner
2020-04-13 18:21:08 block_01 executed
2020-04-13 18:21:08 e_rgr_Bewohner_events home
2020-04-13 18:19:36 mode enabled
2020-04-13 18:11:08 state cmd_2
2020-04-13 18:19:36 timer_01_c01 14.04.2020 08:00:00
2020-04-13 18:19:36 timer_02_c01 13.04.2020 19:00:00
Regex:
accu:
cond:
rgr_Bewohner:
0:
&STATE ^rgr_Bewohner$
1:
attr:
cmdState:
wait:
waitdel:
condition:
0 if (::DOIF_time($hash,0,1,$wday,$hms) and ::EventDoIf('rgr_Bewohner',$hash,'absent',1) and [KeineReinigungHeute() eq "0"])
{fhem_set "dmStaubsauger on"}
1
days:
helper:
DEVFILTER ^global$|^rgr_Bewohner$
NOTIFYDEV global|rgr_Bewohner
event home
globalinit 1
last_timer 3
sleeptimer -1
triggerDev rgr_Bewohner
triggerEvents:
home
triggerEventsState:
state: home
internals:
interval:
0 -1
1 0
intervalfunc:
localtime:
0 1586844000
1 1586797200
perlblock:
0
1
readings:
realtime:
0 08:00:00
1 19:00:00
time:
0 08:00:00
1 19:00:00
timeCond:
0 0
1 0
timer:
0 0
1 0
timers:
0 0 1
trigger:
all rgr_Bewohner
triggertime:
1586797200:
localtime 1586797200
hash:
1586844000:
localtime 1586844000
hash:
uiState:
uiTable:
Attributes:
Viele Grüße
Michael
Aber das DOIF triggert ja so auch nicht oder? Da müsstest Du checkall machen.
Der einzige Trigger ist die Zeit und der Zeitpunkt heute ist vorbei. Also wenn ich eine Funktion einbaue {} und checkall mache kommt ein Fehler.
Der Perlmodus wie von xenos1984 vorgeschlagen geht sicher. Ich würde allerdings dann meine Funktion gleich logisch beenden. Wenn diese 0 und 1 liefert brauchst Du nicht noch auf 0 und 1 zu prüfen.
Hi,
Zitat von: Otto123 am 13 April 2020, 18:40:48
Der Perlmodus wie von xenos1984 vorgeschlagen geht sicher. Ich würde allerdings dann meine Funktion gleich logisch beenden. Wenn diese 0 und 1 liefert brauchst Du nicht noch auf 0 und 1 zu prüfen.
Das funktioniert leider nicht, dann wird der folgende Fehler geschmissen: condition c01: Undefined subroutine &DOIF::KeineReinigungHeute called, line 1 (wenn ich den Perlmodus verwende).
Ich hatte das DOIF zwischenzeitlich mal testweise bis 19:00 Uhr abgeändert. Es triggert, wenn ich die letzte Bedingung ("KeineReinigungHeute") ersatzlos herausnehme. Der Knackepunkt liegt daher m. E. an der Funktion.
War da nicht was mit "eigenem Namensraum" bei DOIF!?
Wenn du Subs in deiner myUtils rufen willst musst du irgendwie ::Funktionsname machen...
Wobei ich mir mit den :: nicht sicher bin...
...aber auch den Thread wo das so beantwortet wurde nicht mehr finde...
EDIT: https://forum.fhem.de/index.php/topic,89828.msg946655.html#msg946655
EDIT: aber ist wohl eh nicht relevant...
Gruß, Joachim
Im DOIF-FHEM-Modus ist die Bedingung immer Perl, daher ganz einfach:
define di.Reinigung DOIF ([08:00-18:00] and [rgr_Bewohner] eq "absent" and KeineReinigungHeute() eq "0") \
(set dmStaubsauger on)
Zitat von: Damian am 13 April 2020, 19:00:32
Im DOIF-FHEM-Modus ist die Bedingung immer Perl, daher ganz einfach:
define di.Reinigung DOIF ([08:00-18:00] and [rgr_Bewohner] eq "absent" and KeineReinigungHeute() eq "0") \
(set dmStaubsauger on)
Super! Dankeschön, das hat funktioniert!