Guten Tag Zusammen,
ich habe mich heute mal an DOIF herangetastet.
Mein Vorhaben ist per Dummy ein Relais zu schalten 15s danach via WOL den Server zu starten, was natürlich auch klappt.
Wenn ich im Dummy "ShutDown" wähle, dann fährt der Server herunter.
Nun haben wir im Dummy swn state "ShutDown" und in WOL isRunning als "false", nun soll das Relais wieder abgeschaltet werden und der Dummy auf OFF gesetzt werden.
Mein DOIF: (Die Zeilenumbrüche sind im DOIF nicht, die hab ich hier einfach mal rein geamcht, zwecks Übersicht)
([Dummy.Start.Server.Main:"ON"]) (set WZ.ID003.Server.Main ON,define at_tmp1 at +00:00:15 set WOL.IT.Server.Main ON)
DOELSEIF ([WOL.IT.Server.Main isRunning: "false"] and [Dummy.Start.Server.Main:"ShutDown"]) (set Dummy.Start.Server.Main OFF,set WZ.ID003.Server.Main OFF)
DOELSEIF ([Dummy.Start.Server.Main:"ShutDown"]) (set WOL.IT.Server.Main OFF)
Ich möchte gerne auf "isRunning: false" abfragen.
Ich bedanke mich bei euch und wünsche einen schönen Samstag.
Beste Grüße
Gear
([WOL.IT.Server.Main isRunning: "false"] and [Dummy.Start.Server.Main:"ShutDown"])
Das ist dein Problem. Du triggerst auf ein Event und verknüpftst ein and mit einem zweiten Event. Es wird also auf die Nanosekunde genau erwartet das beide Events kommen. Das geht nicht. Du musst eine Zustandsabfrage aus einem der beiden machen.
Okey, das habe ich mir schon fast gedacht...
Also sprich auf einen Triggern und dann Perl mit IF/ELSE, wenn ich das richtig verstanden habe. =)
Vielen Dank! =D
Grüße
Gear
Oder eben mit dem "?" auf den Zustand einer der beiden abfragen.
Da hatte ich mal was zu gelesen, aber hab mich noch nicht damit befasst.
Hast du nen dirketen Link wo das beschrieben steht mit dem "?"
([WOL.IT.Server.Main isRunning: "false"] and [?Dummy.Start.Server.Main] eq "ShutDown")
Als Beispiel. Und du machst alles auf Zustand. Dann reagiert das Teil bei Zustandsänderung.
([WOL.IT.Server.Main isRunning] eq "false" and [Dummy.Start.Server.Main] eq "ShutDown")
Vielen Dank.
Was ist der Unterschied zwischen
[WOL.IT.Server.Main isRunning: "false"]
und
[WOL.IT.Server.Main isRunning] eq "false"
??
Hatte ich geschrieben.
Das eine reagiert auf Event das andere auf Zustand.
Ahh, sry so war das gemeint! =D
Vielen Dank, ich teste es gleich mal.
Ich glaube ich bin zu doof dafür oder habs tatsächlich falsch verstanden, sry. =/
Habe es nun mit beiden versucht, aber er reagiert nicht drauf.
Und nun?
Ich habe in den Readings gerade folgendes gesehen:
timer_01_c02 error: Wrong timespec WOL.IT.Server.MainisRunning:"false": either HH:MM:SS or {perlcode}
Er hat scheinbar ein Problem mit dem Leerzeichen, wenn ich das richtig verstehe.
Zitat von: Gear am 02 Juni 2018, 13:52:47
Ich habe in den Readings gerade folgendes gesehen:
timer_01_c02 error: Wrong timespec WOL.IT.Server.MainisRunning:"false": either HH:MM:SS or {perlcode}
Er hat scheinbar ein Problem mit dem Leerzeichen, wenn ich das richtig verstehe.
So lange Du mir Dein Define nicht gibst kann ich nichts machen.
Mach mal bitte ein list vom Device.
Hier das List:
Internals:
DEF XX:XX:XX:XX:XX:XX XXX.XXX.XXX.XXX BOTH
IP XXX.XXX.XXX.XXX
MAC XX:XX:XX:XX:XX:XX
MODE BOTH
NAME WOL.IT.Server.Main
NR 63
REPEAT 000
STATE OFF
TYPE WOL
READINGS:
2018-06-02 13:35:29 active off
2018-06-02 14:03:35 isRunning false
2018-06-02 13:06:08 packet_via_EW XX:XX:XX:XX:XX:XX
2018-06-02 13:06:08 packet_via_UDP XXX.XXX.XXX.XXX
2018-06-02 14:03:35 state off
TIMER:
WOL.IT.Server.Main_ping:
HASH WOL.IT.Server.Main
MODIFIER ping
NAME WOL.IT.Server.Main_ping
helper:
Attributes:
DbLogExclude .*
devStateIcon ON:it_nas@green OFF:it_nas@red
eventMap on:ON off:OFF
interval 60
room 11 IT
Oder meintest du das DOIF?
Internals:
DEF ([Dummy.Start.Server.Main:"ON"])
(set WZ.ID003.Server.Main ON,define at_tmp1 at +00:00:15 set WOL.IT.Server.Main ON)
DOELSEIF ([WOL.IT.Server.Main isRunning:"false"] and [Dummy.Start.Server.Main] eq "ShutDown")
(set Dummy.Start.Server.Main OFF,set WZ.ID003.Server.Main OFF)
DOELSEIF ([Dummy.Start.Server.Main:"ShutDown"])
(set WOL.IT.Server.Main OFF)
MODEL FHEM
NAME DOIF.Start.Server.Main
NR 96
NTFY_ORDER 50-DOIF.Start.Server.Main
STATE cmd_3
TYPE DOIF
READINGS:
2018-06-02 14:09:27 Device Dummy.Start.Server.Main
2018-06-02 14:09:20 cmd 3
2018-06-02 14:09:20 cmd_event Dummy.Start.Server.Main
2018-06-02 14:09:20 cmd_nr 3
2018-06-02 14:09:27 e_Dummy.Start.Server.Main_STATE ShutDown
2018-06-02 14:09:27 e_Dummy.Start.Server.Main_events ShutDown
2018-06-02 14:09:18 mode enabled
2018-06-02 14:09:20 state cmd_3
2018-06-02 14:09:18 timer_01_c02 error: Wrong timespec WOL.IT.Server.Main.*isRunning:"false": either HH:MM:SS or {perlcode}
Regex:
condition:
0 EventDoIf('Dummy.Start.Server.Main',$hash,'ON',1)
1 DOIF_time_once($hash,0,$wday) and InternalDoIf($hash,'Dummy.Start.Server.Main','STATE') eq "ShutDown"
2 EventDoIf('Dummy.Start.Server.Main',$hash,'ShutDown',1)
devices:
0 Dummy.Start.Server.Main
1 Dummy.Start.Server.Main
2 Dummy.Start.Server.Main
all Dummy.Start.Server.Main
do:
0:
0 set WZ.ID003.Server.Main ON,define at_tmp1 at +00:00:15 set WOL.IT.Server.Main ON
1:
0 set Dummy.Start.Server.Main OFF,set WZ.ID003.Server.Main OFF
2:
0 set WOL.IT.Server.Main OFF
3:
helper:
DOIF_Readings_events
DOIF_eventas
event ShutDown
globalinit 1
last_timer 1
sleeptimer -1
timerdev Dummy.Start.Server.Main
timerevent ShutDown
triggerDev Dummy.Start.Server.Main
timerevents:
ShutDown
timereventsState:
state: ShutDown
triggerEvents:
ShutDown
triggerEventsState:
state: ShutDown
internals:
1 Dummy.Start.Server.Main:STATE
all Dummy.Start.Server.Main:STATE
itimer:
localtime:
readings:
time:
0 WOL.IT.Server.Main.*isRunning:"false"
timeCond:
0 1
timer:
0 0
timers:
1 0
trigger:
all Dummy.Start.Server.Main
uiState:
uiTable:
Attributes:
DbLogExclude .*
Du hast ja null umgesetzt von dem was ich dir geschrieben habe. Habe sogar Beispiel gegeben.
Ich habe es mit deinen Beispielen versucht.
Weder
([WOL.IT.Server.Main isRunning: "false"] and [?Dummy.Start.Server.Main] eq "ShutDown")
noch
([WOL.IT.Server.Main isRunning] eq "false" and [Dummy.Start.Server.Main] eq "ShutDown")
haben etwas gebracht.
Das Problem liegt an dem Leerzeichen, nur keine Ahnung wie ich das beheben kann.
ein ":" hat nichts gebracht wie ich über google als "lösung" gefunden habe.
WOL.IT.Server.Main isRunning
Das Leerzeichen dazwischen verursacht das Problem.
So jetzt geht es.
DOELSEIF ([WOL.IT.Server.Main:isRunning] eq "false" and [?Dummy.Start.Server.Main] eq "ShutDown")
Danke für die Hilfe.
Grüße
Gear
Ach jetzt sehe ich das erst mit dem Leerzeichen. War auf dem Handy nicht zu erkennen.
Macht nichts. =D
Danke nochmals für die Hilfe.