Hallo!
Erst mal vielen Dank für FHEM und die vielen Module (wie DOIF) und die ganzen Anleitungen!
Allerdings bin ich auf ein Problem gestoßen, welches ich trotz Suchens (Google+Forum) nicht lösen kann.
Ich möchte gerne in einem DOIF mit dem FHEM IF einen Fall abfragen und dann eine Aktion auslösen oder nicht.
Das funktioniert aber leider nicht, da kommt im Log nur "Unknown command if, try help."
Wenn ich das gleiche mit Perl if mache, dann geht es.
Hier das nicht funktionierende FHEM IF:
define TESTFertigBenachrichtigung DOIF ([TESTStatus] eq 'done')\
(\
set TESTMeldungVerzoegerung {([TESTMeldungVerzoegerung]*2)}\
)\
(\
IF ([TESTMeldungVerzoegerung] == 120)\
(set BenachrichtigungStephan message TEST fuer Stephan! | TEST)\
)\
(\
set BenachrichtigungStephan message TEST fuer Steffi! | TEST\
)\
DOELSE \
(\
set TESTMeldungVerzoegerung 60\
)
attr TESTFertigBenachrichtigung repeatcmd [TESTMeldungVerzoegerung]
attr TESTFertigBenachrichtigung repeatsame 5
attr TESTFertigBenachrichtigung do always
Und hier die funktionierende Variante mit Perl if:
define TESTFertigBenachrichtigung DOIF ([TESTStatus] eq 'done')\
(\
set TESTMeldungVerzoegerung {([TESTMeldungVerzoegerung]*2)}\
)\
(\
{if (ReadingsVal("TESTMeldungVerzoegerung","state",0) == 120) {fhem("set BenachrichtigungStephan message TEST fuer Stephan! | TEST")}}\
)\
(\
set BenachrichtigungStephan message TEST fuer Steffi! | TEST\
)\
DOELSE \
(\
set TESTMeldungVerzoegerung 60\
)
attr TESTFertigBenachrichtigung repeatcmd [TESTMeldungVerzoegerung]
attr TESTFertigBenachrichtigung repeatsame 5
attr TESTFertigBenachrichtigung do always
Laut commandref sollte das IF im DOIF ja funktionieren, aber irgendwas mache ich da falsch.
OT: Mir würde es in diesem speziellen Fall auch reichen, wenn die erste "set Benachrichtigung..." nur einmal ausgeführt würde, aber dazu müsste DOIF mit dem repeatsame die cmds trennen können, was m.W. (noch) nicht geht.
LG,
Stephan.
In der von Dir angegebenen Fehlermeldung steht "if", wie kommst Du darauf, dass es mit "IF" zusammen hängt?
Befindet sich ein Leerzeichen zwischen "IF" und der folgenden "("?
Du verwendest Befehlssequenzen ohne Wait, warum?
Ich komme darauf, weil es genau dann im Log kommt, wenn das DOIF auslöst.
In der Perl if Variante kommt es nicht im Log.
Daher muss es im DOIF mit der FHEM IF Variante liegen.
Um das sauber reproduzierbar zu machen, habe ich extra das oben geschriebene DOIF gebaut, um andere Effekte auszuschließen.
Ja zwischen IF und ( ist ein Leerzeichen.
Befehlssequenzen sind die () Blöcke, richtig?
Man könnte es auch mit "," machen, oder?
Was wäre der Vor-/Nachteil?
Hi,
funktioniert das denn in DOIF? (set BenachrichtigungStephan message TEST fuer Stephan! | TEST)
Vielleicht ist nicht IF sondern dass "|" das Problem.
Gruß Otto
Zitat von: loescher am 15 August 2017, 19:57:42
Ich komme darauf, weil es genau dann im Log kommt, wenn das DOIF auslöst.
In der Perl if Variante kommt es nicht im Log.
Daher muss es im DOIF mit der FHEM IF Variante liegen.
Um das sauber reproduzierbar zu machen, habe ich extra das oben geschriebene DOIF gebaut, um andere Effekte auszuschließen.
Ja zwischen IF und ( ist ein Leerzeichen.
Befehlssequenzen sind die () Blöcke, richtig?
Man könnte es auch mit "," machen, oder?
Was wäre der Vor-/Nachteil?
Ja.
Ja.
Unnötig und Mehrarbeit für DOIF, s. Commandref zu wait.
Du könntest die Raterei beenden in dem Du qualifizierte Infos lieferst, dazu könntest Du diesen Leitfaden nutzen: https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche
OK, Danke für den Hinweis zur Checkliste bzgl. Fehlersuche!
@Otto: Die Benachrichtigung funktioniert, wenn ich "if" statt "IF" verwende. Ich habe es jetzt ohne das "|" probiert, aber der Fehler bleibt.
Hier meine verwendeten Versionen:
Latest Revision: 13812
File Rev Last Change
fhem.pl 13796 2017-03-25 14:22:15Z rudolfkoenig
98_DOIF.pm 13791 2017-03-24 21:32:39Z Damian
98_IF.pm 12944 2017-01-03 12:56:17Z Damian
Ein Update "auf Verdacht" wollte ich jetzt nicht machen, da sonst ja alles bestens läuft.
Gibt es einfach durchsuchbare Changelogs, in denen ich einen Hinweis auf einen beseitigten bekannten Bug finden könnte?
Ich habe die fhem.cfg nicht direkt bearbeitet, sondern gebe das DOIF per telnet ein.
Hier der list:
Internals:
CFGFN
DEF ([TESTStatus] eq 'done')
(
set TESTMeldungVerzoegerung {([TESTMeldungVerzoegerung]*2)}
)
(
IF ([TESTMeldungVerzoegerung] == 120)
(set BenachrichtigungStephan message TEST fuer Stephan)
)
(
set BenachrichtigungStephan message TEST fuer Steffi! | TEST
)
DOELSE
(
set TESTMeldungVerzoegerung 60
)
NAME TESTFertigBenachrichtigung
NR 593
NTFY_ORDER 50-TESTFertigBenachrichtigung
STATE cmd_2
TYPE DOIF
Readings:
2017-08-16 22:02:51 Device TESTStatus
2017-08-16 22:02:51 cmd 2
2017-08-16 22:02:51 cmd_event TESTStatus
2017-08-16 22:02:51 cmd_nr 2
2017-08-16 22:02:51 e_TESTStatus_STATE running
2017-08-16 22:02:51 state cmd_2
2017-08-16 22:02:51 wait_timer no timer
Condition:
0 InternalDoIf($hash,'TESTStatus','STATE') eq 'done'
Devices:
0 TESTStatus
all TESTStatus
Do:
0:
0 set TESTMeldungVerzoegerung {([TESTMeldungVerzoegerung]*2)}
1 IF ([TESTMeldungVerzoegerung] == 120) (set BenachrichtigungStephan message TEST fuer Stephan)
2 set BenachrichtigungStephan message TEST fuer Steffi! | TEST
1:
0 set TESTMeldungVerzoegerung 60
Helper:
event running
globalinit 1
last_timer 0
sleepdevice TESTStatus
sleepsubtimer 0
sleeptimer -1
timerdev TESTStatus
timerevent running
triggerDev TESTStatus
timerevents:
running
timereventsState:
state: running
triggerEvents:
running
triggerEventsState:
state: running
Internals:
0 TESTStatus:STATE
all TESTStatus:STATE
Itimer:
Readings:
Regexp:
0:
All:
State:
Trigger:
Attributes:
do always
group TEST
repeatcmd [TESTMeldungVerzoegerung]
repeatsame 5
room TEST
Die Fehlermeldung im Log ist:
2017-08-16_22:02:39 TESTFertigBenachrichtigung error: IF ([TESTMeldungVerzoegerung] == 120) (set BenachrichtigungStephan message TEST fuer Stephan): Unknown command if, try help.
LG, Stephan.
IF im DOIF funktioniert, das läuft bei mir an verschiedenen Stellen einwandfrei.
Dein DOIF müsste auch funktionieren, auch mit Deiner DOIF-Version. Was danach geändert wurde siehst Du im Changelog im Verzeichnis ./fhem oder hier https://forum.fhem.de/index.php/board,57.0.html
Es kann vorkommen, dass Fehler in der Definition oder ein vergessenes "shutdown restart" nach einem Update Spuren hinterlassen, die zu unerklärlichem Verhalten führen. Ich mache dann folgendes:
Die fehlerfreie Definition aus "Raw definition" kopieren und in einem Texteditor sichern.
Die Definition löschen, CFG mit save speichern.
FHEM shutdown
Reboot des System
Definition über Raw definition wieder einspielen.
Das hilft sehr oft.
Edit: Wenn dies
defmod IFinDOIF DOIF (#1) (IF (1) (setreading $SELF testreading es geht))
bei Dir nicht funktioniert, dann ist in dem System was faul.
Mit set IFinDOIF cmd_1
müsstest Du testreading im DOIF setzen können.
Versuch mal mit einem zusätzlichen Leerzeichen vor dem IF. Früher gab es da mal Schwierigkeiten auch bei DOIF, allerdings wurde das mehrfach weiterentwickelt und verbessert.
Vielen Dank für eure Hilfe und Geduld mit mir.
Ein Leerzeichen vor dem IF hat auch nicht geholfen.
Das "Test" DOIF von Ellert hat ebenfalls nicht funktioniert.
Geholfen hat tatsächlich das:
- Die Definition gelöscht
- CFG mit save gespeichert
- FHEM shutdown
- FHEM neu gestartet
- Definition wieder eingespielt
Jetzt gehen alle IFs :)
Nochmals vielen Dank!
LG,
Stephan.