IF Abfrage funktioniert nicht

Begonnen von StefanJoe, 07 Januar 2016, 22:34:25

Vorheriges Thema - Nächstes Thema

StefanJoe

Hallo zusammen,
folgendes Schnipsel funktioniert irgendwie nicht:


define HandyStefan yowsup 49176(nummer)
define notifyHandyStefan notify HandyStefan:message.* (IF ($EVENT eq "message: test") set HandyStefan send Test)


liefert beim Trigger mit "test":

[2016.01.07 22:31:17 3: notifyHandyStefan return value: Unknown command (IF, try help.
2016.01.07 22:31:17 3: HandyStefan: commands not allowed


Merkwürdigerweise funktioniert ein:

define notifyHandyStefan notify HandyStefan:message.* set HandyStefan send Test

einwandfrei (nur ist eine unkonditioniertes Echo irgendwie sinnfrei ;))

Jemand eine Idee wo ich suchen müsste ? Danke für eine Info!

Puschel74

#1
Beitrag gelöscht da es um IF geht - damit hab ich keine Ahnung.
Ich brauch ne Brille - notify kennt kein IF.

Edith:
Wenn in $EVENT wirklich message: test steht sollte das im DEF gehen:
HandyStefan:message.* {
  if ($EVENT eq "message: test") {
    fhem("set HandyStefan send Test");
  }
}
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Zrrronggg!

#2
ZitatIch brauch ne Brille - notify kennt kein IF.

Hm. Laut Doku schon. Da gibts z.b. dieses Beispiel:
define test notify lamp
IF ([lamp] eq "on") (
IF ([outdoor:humidity] < 70)
(set lamp off) ...


Ich bin auch keine Experte (benutze nur Perl-if, aus Gewohnheit), aber wenn ich die Doku richtig verstehe sind die Klammern falsch.

Probier mal
define notifyHandyStefan notify HandyStefan:message.* IF ($EVENT eq "message: test") (set HandyStefan send Test)


Mit Perl-if müsste das so aussehen:
define notifyHandyStefan notify HandyStefan:message.* { if ($EVENT eq "message: test") { fhem("set HandyStefan send Test") } }

Die doch recht minimalen Vorteile von Fhem "IF" gegenüber perl "if" waren damals bei der Entwicklung von IF ein Kritikpunkt, später hat der Autor vielleicht auch deswegen das deutlich mächtigere DOIF-Modul entworfen, welches IF eigentlich obsolet gemacht hat.



FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Puschel74

#3
Ahhhrghhh - IF ist ja kein Modul sondern ein Befehl.
Ok, aber ich benutz auch nur if und kein IF - ich ziehe meinen Einwand daher wieder zurück.
Edith: Aber mein Code sollte auch klappen  ::)
Edith1: @Zrrronggg!
OT
Und da haben wir wieder den Unterschied in der Länge der fhem.cfg.
Ich kann Einzeiler nicht ausstehen weil ich sie nicht verstehe lesen kann :P
Schön strukturiert Zeilenweise ist für mich einfach schöner zu lesen - so wie die Zeitung auch  ;D
BTT
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Zrrronggg!

#4
Na immerhin haben wir die gleiche Perl Lösung vorgeschlagen  ;D

Edith1:@ Puschel74
auch OT
Ja, wenn ich das so wie du schreiben würde kämen wir vermutlich auf ähnliche Längen. Ich weiss nicht warum, aber ich komme mit Einzeilern irgendwie klar und finde die strukturierte Darstellung nerfig, auch wegen der immer wieder eingestreuten aber eigentlich nicht notwendigen Zeichen, wie z.b. das ";" in deiner Lösung.
Vor allem aber wegen so Bullshit-Konstruktionen wie

define xy notify :message.* {
  if ($EVENT eq "message: test") {
    fhem("set irgendwas on");
    fhem("set irgendwasanderes off");
  }
}


die die strukturierte Schreibweise gerne herausfordert.

Ich habe sogar schon solche Sachen gesehen:

define xy notify :message.* {
    fhem("set irgendwas on");
    fhem("set irgendwasanderes off");
  }


Funktioniert, ist aber Cargo-Cult-Programming.

Und gerne verliere ich den Überblick über die Klammern bei der Strukturierung. Ich weiss, dass ich damit Exot bin, kann ich nix für.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Damian

Zitat von: Zrrronggg! am 07 Januar 2016, 22:55:13
Hm. Laut Doku schon. Da gibts z.b. dieses Beispiel:
define test notify lamp
IF ([lamp] eq "on") (
IF ([outdoor:humidity] < 70)
(set lamp off) ...


Ich bin auch keine Experte (benutze nur Perl-if, aus Gewohnheit), aber wenn ich die Doku richtig verstehe sind die Klammern falsch.

Probier mal
define notifyHandyStefan notify HandyStefan:message.* IF ($EVENT eq "message: test") (set HandyStefan send Test)


Mit Perl-if müsste das so aussehen:
define notifyHandyStefan notify HandyStefan:message.* { if ($EVENT eq "message: test") { fhem("set HandyStefan send Test") } }

Die doch recht minimalen Vorteile von Fhem "IF" gegenüber perl "if" waren damals bei der Entwicklung von IF ein Kritikpunkt, später hat der Autor vielleicht auch deswegen das deutlich mächtigere DOIF-Modul entworfen, welches IF eigentlich obsolet gemacht hat.

Nur mal zur Info: im FHEM-Teil wird $EVENT einfach durch das Event ersetzt. Damit würde beim FHEM-IF ankommen: IF (bla eq "bla") .... Damit es bei IF funktioniert müsste man das EVENT in Anführungszeichen setzen, dann ergibt das IF ("bla" eq "bla")..., ansonsten beschwert sich der Perl-Interpreter.

Wenn man auf Perl verzichten möchte, dann kann man es gleich mit DOIF lösen. Hier wäre das dann:

define di DOIF ([HandyStefan:message] eq "test") (set HandyStefan send Test)

Bei der Länge braucht man auch keine Strukturierung ;)

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

StefanJoe

Hallo Damian,

die letzte Variante finde ich auch am angenehmsten, ich erhalte aber ein:

2016.01.08 00:25:11 3: WhatsApp: sending /message send 49xxxxxxxx 'Test'
2016.01.08 00:25:12 3: HandyStefan: commands not allowed

zurück. Eine Idee woran das liegen könnte ?

Zrrronggg!

ZitatCode: [Auswählen]
define di DOIF ([HandyStefan:message] eq "test") (set HandyStefan send Test)

Bei der Länge braucht man auch keine Strukturierung ;)

8)

ZitatEine Idee woran das liegen könnte ?
Irgendwas im Modul das die Message senden soll klappt nicht.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Prof. Dr. Peter Henning

ZitatFunktioniert, ist aber Cargo-Cult-Programming.

Aber dafür auch nach 30 Jahren noch wartbar.

LG

pah

Zrrronggg!

#9
Wieso wird die Wartbarkeit durch das einstreuen mehrerer

fhem(" ...")

erhöht?

Wer

define xy notify :message.* {
  if ($EVENT eq "message: test") {
    fhem("set irgendwas on");
    fhem("set irgendwasanderes off");
  }
}


anstatt

define xy notify :message.* {
  if ($EVENT eq "message: test") {
    fhem("set irgendwas on;;
    set irgendwasanderes off")
  }
}


schreibt, hat schon beim Hinschreiben was nicht verstanden. :o

Ich propagiere ja nicht mal ernsthaft, dass man lieber

define xy notify :message.* {if ($EVENT eq "message: test") {fhem("set irgendwas on;;set irgendwasanderes off")}}

schreiben soll, aber unübersichtlicher finde ich das nicht, eher im Gegenteil.
(gut, bei deutlich längeren Einzeilern ist mit der Übersichtlichkeit irgendwann Schluss, schon klar.)

Aber wir sind in Off Topic Land   ;)
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Puschel74

Weiter OT  :P

Zitathat schon beim Hinschreiben was nicht verstanden.
Das
:message.*
müsste eher so
.*:message.*
aussehen damit es klappt (oder hab ich wiedermal was verpasst  :o ).

Aber ja, ich liebe meine Codes die so
if ($EVENT eq "irgendwas") {
    fhem("set irgendwas on");
    fhem("set irgendwasanderes off");
  }

aussehen.
Warum? Tja, ist so und ich war schon froh darüber das meine Codes so aussehen (dann versteh ich wenigstens was dort steht  :-[ ).

Aber das ist doch das schöne an FHEM - man kann Einzeiler verwenden oder die Codes "aufzeilen" und auch "umständlich" schreiben.
Eben jeder wie er mag  ;)
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

StefanJoe

Zitat von: Zrrronggg! am 08 Januar 2016, 00:33:28
8)
Irgendwas im Modul das die Message senden soll klappt nicht.

Aber das senden ohne if-Konditionierung funktioniert ja, deswegen verstehe ich nicht wieso die Konditionierung hier einen Einfluss auf die Ausführung des Codes haben sollte ;)

Puschel74

Was hält dich davon ab deinen aktuell verwendeten Code zu posten?
Das Sahnehäubchen wäre dann noch die Meldung im Logfile dazu - dann bräuchten sich die Hilfswilligen nicht alles Infos irgendwo zusammen zu suchen.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Zrrronggg!

#13
ZitatDas

:message.*
müsste eher so

.*:message.*
aussehen damit es klappt (oder hab ich wiedermal was verpasst  :o ).
Ach den Teil hab ich mir ehrlich gesagt gar nicht echt angesehen. Aber im Moment wüsste ich nicht, wieso
define notifyHandyStefan notify HandyStefan:message.*
nicht gehen sollte. Hängt eben davon ab, was für events da kommen können. Wenn - wie ich vermute - die events die Form
message <irgendeinetext> haben, müsste das triggern.

Und laut Threadowner geht das ja auch.


ZitatAber ja, ich liebe meine Codes die so

if ($EVENT eq "irgendwas") {
    fhem("set irgendwas on");
    fhem("set irgendwasanderes off");
  }

aussehen.
Warum? Tja, ist so und ich war schon froh darüber das meine Codes so aussehen (dann versteh ich wenigstens was dort steht  :-[ ).

Okeeeee ...  :o

Also strukturiert verstehe ich ja (also sagen wir mal: ich kann mir vostellen, dass Leute das besser zu lesen finden als Einzeiler, und je länger meine Einzeiler ist desto besser kann ich mir das vorstellen). Aber warum man die Perl und FHEM Ebene ohne faktischen Nutzen (Lesbarkeit des Codes ist ja ein Metanutzen) so oft hin und her wechseln will kapier ich dann echt nicht. Ich meine SCHNELLER wird das ganz dadurch ja auch nicht gerade. Sieht für mich mehr wie ein Beitrag zum Wettbewerb: "Wie kriege ich einem define möglichst viele Klammern unter" aus.

Aber gut: Du musst ja damit zurecht kommen.



Zitat
ZitatIrgendwas im Modul das die Message senden soll klappt nicht.

Aber das senden ohne if-Konditionierung funktioniert ja, deswegen verstehe ich nicht wieso die Konditionierung hier einen Einfluss auf die Ausführung des Codes haben sollte ;)

Äh ja, da hast du  ... irgendwie recht.  Das Problem ich benutze weder WhatsApp also noch das passende Modul und verstehe daher nicht wie das funktioniert und was die Fehlermeldung meinen könnte.

Nur um ganz sicher zu seine: Kannst du mal alternativ die von Puschel74 und mir vorgeschlagene perl Variante testen? Ich glaube nicht dass das einen Unterschied macht, aber will ausschliessen, dass DOIF einen mir unbekannten Nebeneffekt hat, denn ich gerade nicht verstehe.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Zrrronggg!

#14
@StefanJoe


Okay, ich hab die Situation noch mal auf mich wirken lassen. So richtig fällt mir nichts ein, aber
was ich aber für Debuging blöd finde ist, dass
a) Sowohl die Quelle des Notify also auch die Senke der Aktion das selbe Telefon ist
b) der Messagetext der das senden triggert in deinemn Testsceanrion den selben Text sendet

Beides zusammen gibt ne super Chance auf Rekursion, aber zumindest mal kann man nicht so gut sehen, auf was sich die Fehlermeldung
Zitat2016.01.08 00:25:12 3: HandyStefan: commands not allowed
überhaupt bezieht.

Um sich auf eine bessere Fehlersuche zu begeben würde ich das Versenden einer Message die "Test" heisst nicht vom Eingang einer Message auf dem selben Telefon die "test" heisst auslösen lassen.

Entzerr das mal und sie dir mal an, wie das dann so läuft.

Ich kenne wie gesagt DOIF nicht, aber mir ist so, als habe ich mal gelesen, dass man DOIF expliziet sagen muss, wenn es bei JEDEM eintreffen eines an sich gleichen Events auch auslösen soll. Ich bin jetzt gerade zu müde alle damit möglichen Verwicklungen zu durchdenken bzw. das zu recherchieren. Das machen wir dann mit Hilfe von Damian, wenn wir erstmal 2-3 andere Sachen versucht haben.

Also zusammnegefasst:

- Zu versendende Nachricht muss anders sein als auslösende Nachricht.
- Quelle der auslösenden Nachricht muss eine andere sein als Ziel der zu versenden Nachricht.
Zur Not, wenn du nur eine Funke hast, mit Hilfe von Aliasen oder Dummies
- bitte mal unseren Perlcode alternativ versuchen

Von den Ergebnissen und Fehlermeldungen berichten. Ggf VERBOSE 5 Logfileeinträge mitliefern.

Dann sehen wir weiter.

Edit:
Commandref zu yowsup sagt, dass man per Atrr definieren kann, ob einkommen Messages als Fhem Command interpretiert werden sollen. Default ist 0= "don't accept commands". Dann wäre die "Fehlermeldung" eventuell nur der Hinweis, dass das eine  Sekunde vorher abgesendete "Test" wieder bei Fhem angekommen ist und gemäss default nicht als Fhem Commando interpretiert wird. Denn

Zitat
attr commandPrefix 1   = "commands allowed"

Das klingt doch schwer dannach. Wenn es so ist würde diese Meldung durch die einkommende Meldung ausgelöst und wir hätten das nicht bemerkt weil wie ich oben schon anmerkte eben leider der Name des Empfangsdevices=Sendedevices ist.


Und mit diesen beiden etwas längeren Posts verabschiede ich mich für heute, es ist fast mein Avatar-Bild.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL