[gelöst] FHEM IF im DOIF funktioniert nicht, Perl if schon

Begonnen von loescher, 14 August 2017, 21:37:30

Vorheriges Thema - Nächstes Thema

loescher

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.

Ellert

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?

loescher

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?

Otto123

Hi,

funktioniert das denn in DOIF? (set BenachrichtigungStephan message TEST fuer Stephan! | TEST)Vielleicht ist nicht IF sondern dass "|" das Problem.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Ellert

#4
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

loescher

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.

Ellert

#6
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.

Per

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.

loescher

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.