Hauptmenü

wieder das leidige "if"

Begonnen von fh555, 08 Oktober 2014, 21:07:01

Vorheriges Thema - Nächstes Thema

fh555

Hallo,

ich stelle mal die Frage ersteinmal hier im Anfängerfragen-Bereich.
Ich habe mich jetzt irgendwie erfolglos seit über 2H verrannt und nun Bitte ich um Hilfe.

Ausgangssituation:
FHEM auf einen Raspbeerry funktioniert schon einige Zeit, Jeelink und jetzt NEU Anbindung an MySensors mit MQTT.
Alle Sachen funktionieren eigenständig und ohne Probleme lt. Log-File.

Jetzt zu meinen Problem.
Ich möchte eigentlich eine total simple Aktion auslösen, der MQTT hat mehrere Client (Sensoren) unter anderen ist einer davon ein ganz normaler Switch, welcher die Zustände "1=OFF" und "0=ON" liefert. Dieser soll eine LED-Fensterbeleuchtung (IT-Funksteckdose) "auch" schalten.

Die Fensterbeleuchtung geht normalerweise per at Befehl jeden Tag zu selben Zeit an und aus und funktioniert so seit ca. 2 Monaten.
Jetzt möchte ich, wenn der Schalter des anderen Systems betätigt wird, die Fensterbeleuchtung auch "an" gehen soll.

Also terotisch total simple :-)


define MQTT_MySensors MQTT 192.168.100.250:1883
set MQTT_MySensors connect

define schalter1 MQTT_DEVICE
attr schalter1 IODev MQTT_MySensors
attr schalter1 stateFormat transmission-state
attr schalter1 subscribeReading_state MyMQTT/10/3/V_TRIPPED

define schalter1machwas notify schalter1 { if ("Value(schalter1)" eq "0") { fhem "set B_Dose_Fenster_LED on" } }


Leider kommt weder ein Fehler im Log noch wird irgendeine Aktion ausgelöst!
Im Event-Monitor kann ich aber sehen, dass das Signal zum FHEM Server gelangt.

2014-10-08 21:05:20 MQTT_DEVICE schalter1 transmission-state: publish received
2014-10-08 21:05:20 MQTT_DEVICE schalter1 0

Was mache ich Falsch???

Jens

karl0123

Dein notify für den DEF Bereich:

schalter1 {fhem ("set B_Dose_Fenster_LED on") if (Value("schalter1") == 0)}


0 ist doch sicher die Ziffer 0.


Bitte Anfänger Doc und perl-Hinweise lesen.

fh555

#2
Hi Karl0123,

leider klappt das so nicht: und ja der Wert ist ein "Null"


define schalter1machwas notify schalter1 {fhem ("set B_Dose_Fenster_LED on") if (Value("schalter1") == 0)}


Da kommt der Fehler:

2014.10.08 21:17:18 1: PERL WARNING: Argument "subscribe sent" isn't numeric in numeric eq (==) at (eval 134) line 1.
2014.10.08 21:17:18 3: stacktrace:
2014.10.08 21:17:18 3:     main::__ANON__                      called by (eval 134) (1)
2014.10.08 21:17:18 3:     (eval)                              called by fhem.pl (894)
2014.10.08 21:17:18 3:     main::AnalyzePerlCommand            called by fhem.pl (912)
2014.10.08 21:17:18 3:     main::AnalyzeCommand                called by fhem.pl (847)
2014.10.08 21:17:18 3:     main::AnalyzeCommandChain           called by ./FHEM/91_notify.pm (87)
2014.10.08 21:17:18 3:     main::notify_Exec                   called by fhem.pl (2902)
2014.10.08 21:17:18 3:     main::CallFn                        called by fhem.pl (2825)
2014.10.08 21:17:18 3:     main::DoTrigger                     called by fhem.pl (3565)
2014.10.08 21:17:18 3:     main::readingsEndUpdate             called by fhem.pl (3686)
2014.10.08 21:17:18 3:     main::readingsSingleUpdate          called by ./FHEM/00_MQTT.pm (386)
2014.10.08 21:17:18 3:     MQTT::client_start                  called by FHEM/GPUtils.pm (48)
2014.10.08 21:17:18 3:     GPUtils::GP_ForallClients           called by ./FHEM/00_MQTT.pm (188)
2014.10.08 21:17:18 3:     MQTT::Read                          called by fhem.pl (2902)
2014.10.08 21:17:18 3:     main::CallFn                        called by fhem.pl (594)
2014.10.08 21:17:18 2: IT set B_Dose_Fenster_LED on
2014.10.08 21:17:18 1: PERL WARNING: Argument "subscription acknowledged" isn't numeric in numeric eq (==) at (eval 135) line 1.
2014.10.08 21:17:18 3: stacktrace:
2014.10.08 21:17:18 3:     main::__ANON__                      called by (eval 135) (1)
2014.10.08 21:17:18 3:     (eval)                              called by fhem.pl (894)
2014.10.08 21:17:18 3:     main::AnalyzePerlCommand            called by fhem.pl (912)
2014.10.08 21:17:18 3:     main::AnalyzeCommand                called by fhem.pl (847)
2014.10.08 21:17:18 3:     main::AnalyzeCommandChain           called by ./FHEM/91_notify.pm (87)
2014.10.08 21:17:18 3:     main::notify_Exec                   called by fhem.pl (2902)
2014.10.08 21:17:18 3:     main::CallFn                        called by fhem.pl (2825)
2014.10.08 21:17:18 3:     main::DoTrigger                     called by fhem.pl (3565)
2014.10.08 21:17:18 3:     main::readingsEndUpdate             called by fhem.pl (3686)
2014.10.08 21:17:18 3:     main::readingsSingleUpdate          called by ./FHEM/00_MQTT.pm (262)
2014.10.08 21:17:18 3:     MQTT::__ANON__                      called by FHEM/GPUtils.pm (48)
2014.10.08 21:17:18 3:     GPUtils::GP_ForallClients           called by ./FHEM/00_MQTT.pm (265)
2014.10.08 21:17:18 3:     MQTT::Read                          called by fhem.pl (2902)
2014.10.08 21:17:18 3:     main::CallFn                        called by fhem.pl (594)
2014.10.08 21:17:18 2: IT set B_Dose_Fenster_LED on


und das Licht geht an, obwohl der Schalter nicht betätigt wurde! Aber "Aus" geht er mit den schalter auch nicht.

Eine Änderung / Umstellung in:

define schalter1machwas notify schalter1 if (Value("schalter1") == 0) {fhem ("set B_Dose_Fenster_LED on")}


Bringt "nur" diese Fehlermeldung.

2014.10.08 21:23:32 3: schalter1machwas return value: IF: no left bracket:  {fhem ("set B_Dose_Fenster_LED on")}
2014.10.08 21:23:32 3: schalter1machwas return value: IF: no left bracket:  {fhem ("set B_Dose_Fenster_LED on")}


Mit dieser Fehlermeldung kann ich leider gar nicht anfangen ... linke Bremse?

Dietmar63

dann so:
define schalter1machwas notify schalter1 {if (Value("schalter1") == 0) {fhem ("set B_Dose_Fenster_LED on")}}
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

fh555

so geht es jetzt zwar aber ich bekomme immernoch die Fehlermeldung:


2014.10.08 21:34:09 1: PERL WARNING: Argument "publish received" isn't numeric in numeric eq (==) at (eval 153) line 1.
2014.10.08 21:34:09 3: stacktrace:
2014.10.08 21:34:09 3:     main::__ANON__                      called by (eval 153) (1)
2014.10.08 21:34:09 3:     (eval)                              called by fhem.pl (894)
2014.10.08 21:34:09 3:     main::AnalyzePerlCommand            called by fhem.pl (912)
2014.10.08 21:34:09 3:     main::AnalyzeCommand                called by fhem.pl (847)
2014.10.08 21:34:09 3:     main::AnalyzeCommandChain           called by ./FHEM/91_notify.pm (87)
2014.10.08 21:34:09 3:     main::notify_Exec                   called by fhem.pl (2902)
2014.10.08 21:34:09 3:     main::CallFn                        called by fhem.pl (2825)
2014.10.08 21:34:09 3:     main::DoTrigger                     called by fhem.pl (3565)
2014.10.08 21:34:09 3:     main::readingsEndUpdate             called by fhem.pl (3686)
2014.10.08 21:34:09 3:     main::readingsSingleUpdate          called by ./FHEM/00_MQTT.pm (198)
2014.10.08 21:34:09 3:     MQTT::__ANON__                      called by FHEM/GPUtils.pm (48)
2014.10.08 21:34:09 3:     GPUtils::GP_ForallClients           called by ./FHEM/00_MQTT.pm (205)
2014.10.08 21:34:09 3:     MQTT::Read                          called by fhem.pl (2902)
2014.10.08 21:34:09 3:     main::CallFn                        called by fhem.pl (594)
2014.10.08 21:34:09 2: IT set B_Dose_Fenster_LED on
2014.10.08 21:34:10 1: PERL WARNING: Argument "publish received" isn't numeric in numeric eq (==) at (eval 154) line 1.
2014.10.08 21:34:10 3: stacktrace:
2014.10.08 21:34:10 3:     main::__ANON__                      called by (eval 154) (1)
2014.10.08 21:34:10 3:     (eval)                              called by fhem.pl (894)
2014.10.08 21:34:10 3:     main::AnalyzePerlCommand            called by fhem.pl (912)
2014.10.08 21:34:10 3:     main::AnalyzeCommand                called by fhem.pl (847)
2014.10.08 21:34:10 3:     main::AnalyzeCommandChain           called by ./FHEM/91_notify.pm (87)
2014.10.08 21:34:10 3:     main::notify_Exec                   called by fhem.pl (2902)
2014.10.08 21:34:10 3:     main::CallFn                        called by fhem.pl (2825)
2014.10.08 21:34:10 3:     main::DoTrigger                     called by fhem.pl (3565)
2014.10.08 21:34:10 3:     main::readingsEndUpdate             called by fhem.pl (3686)
2014.10.08 21:34:10 3:     main::readingsSingleUpdate          called by ./FHEM/10_MQTT_DEVICE.pm (163)
2014.10.08 21:34:10 3:     MQTT::DEVICE::onmessage             called by ./FHEM/00_MQTT.pm (199)
2014.10.08 21:34:10 3:     MQTT::__ANON__                      called by FHEM/GPUtils.pm (48)
2014.10.08 21:34:10 3:     GPUtils::GP_ForallClients           called by ./FHEM/00_MQTT.pm (205)
2014.10.08 21:34:10 3:     MQTT::Read                          called by fhem.pl (2902)
2014.10.08 21:34:10 3:     main::CallFn                        called by fhem.pl (594)
2014.10.08 21:34:10 2: IT set B_Dose_Fenster_LED on

karl0123

?? das ist genau das gleiche...

Mach mal ein List von schalter1.

fh555

Internals:
   IODev      MQTT_MySensors
   NAME       schalter1
   NR         34
   STATE      publish received
   TYPE       MQTT_DEVICE
   qos        0
   Readings:
     2014-10-08 21:34:10   state           1
     2014-10-08 21:34:09   transmission-state publish received
   Message_ids:
   subscribe:
     MyMQTT/10/3/V_TRIPPED
   Subscribereadings:
     MyMQTT/10/3/V_TRIPPED state
Attributes:
   IODev      MQTT_MySensors
   stateFormat transmission-state
   subscribeReading_state MyMQTT/10/3/V_TRIPPED

Dietmar63

define schalter1machwas notify schalter1 {Log 3, "Nachricht von @: %"}
Damit sollten wird den wirklichen Inhalt der Nachricht sehen können.
bzw mit:
define schalter1machwas notify schalter1 {Log 3, ">>>".Value("schalter1")."<<<"}
was Value("schalter1") liefert

Meiner Ansicht nach ist eq der richtige Vergleichsoperator.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

fh555

#8
1. Log

define schalter1machwas notify schalter1 {Log 3, "Nachricht von @: %"}



2014.10.08 21:46:43 3: Opening MQTT_MySensors device 192.168.100.250:1883
2014.10.08 21:46:43 3: MQTT_MySensors device opened
2014.10.08 21:46:43 3: Nachricht von schalter1: transmission-state: subscribe sent
2014.10.08 21:46:43 3: Nachricht von schalter1: transmission-state: subscription acknowledged
2014.10.08 21:47:03 3: Nachricht von schalter1: transmission-state: publish received
2014.10.08 21:47:03 3: Nachricht von schalter1: 0
2014.10.08 21:47:03 3: Nachricht von schalter1: transmission-state: publish received
2014.10.08 21:47:03 3: Nachricht von schalter1: 1

fh555

#9
2. log

define schalter1machwas notify schalter1 {Log 3, ">>>".Value("schalter1")."<<<"}



2014.10.08 21:48:34 3: Opening MQTT_MySensors device 192.168.100.250:1883
2014.10.08 21:48:34 3: MQTT_MySensors device opened
2014.10.08 21:48:34 3: >>>subscribe sent<<<
2014.10.08 21:48:34 3: >>>subscription acknowledged<<<
2014.10.08 21:48:51 3: >>>publish received<<<
2014.10.08 21:48:51 3: >>>publish received<<<
2014.10.08 21:48:52 3: >>>publish received<<<
2014.10.08 21:48:52 3: >>>publish received<<<
2014.10.08 21:49:25 3: >>>publish received<<<
2014.10.08 21:49:25 3: >>>publish received<<<
2014.10.08 21:49:26 3: >>>publish received<<<
2014.10.08 21:49:26 3: >>>publish received<<<


Ich habe den Verdacht, nicht das so etwas die Auswertung stört und da ja irgendwann auch mal was numerisches kommt,
führt er die Bedingung trotzdem aus.


transmission-state: subscribe sent

Dietmar63

und ist der Groschen gefallen?
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

fh555

#11
Wenn du meinst das ich mit meiner Vermutung Recht habe, aber deshalb hatte ich ja in meiner Codezeile ja die Auswertung nach dem Zeichen "NULL" gemacht aber da ging es auch nicht!

Deshalb bin ich ja Ratlos  :-\

Kann ich nicht den "state" auslesen? Ich dachte/denke  (kann auch Falsch liegen) das dort entweder die "1"  oder "0" hinterlegt ist.
Jedenfalls lt. "list schalter1"  ???

Dietmar63

ok,
du verwendest die Funktion Value() um den Wert des Schalters zu ermittlen.

Value liefert: publish received und nicht 1

publish received steht in STATE.

Du willst den Inhalt von state. Das ist ein Reading. und Readings bekommst du mit der Funkton ReadingsVal()

define schalter1machwas notify schalter1 {Log 3, ">>>".ReadingsVal("schalter1","state", "not found")."<<<"}

define schalter1machwas notify schalter1 {fhem ("set B_Dose_Fenster_LED on") if (ReadingsVal("schalter1","state", "not found") == 0)}
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

fh555

#13
Danke Dietmar63, jetzt funktioniert es ohne Fehler :-)

Eine Frage hätte ich noch und würde mich freuen, wenn Du mich dahingehend auflklären könntest :-)

Mit ReadingsVal hatte ich auch experiment, hatte es aber damit auch nicht hinbekommen, da ich in der Softwaregeschichte nicht wirklich fit bin.

1. Frage
Warum ist die Anweisung "Rückwärts"? also ich meine zuerst das fhem-Kommando und danach erst die Auswertung
Ich habe mir die command.ref, das wiki, etc. durchgelesen, da ist es immer anderherum, obwohl ich da sehr viel Widersprüchliches gesehen hatte!

2. Frage
ReadingsVal("schalter1","state", "not found"
Variablenwert für schalter1, den state, ??? not found ???
ist "not found" wirklich ein Wert der zurückgeliefert wird, wenn er das Gerät nicht findet bzw. es nicht antwortet?

Danke :-)

Dietmar63

zu 1)
das ist eine Besonderheit von Perl. Es geht vorwärts oder rückwärts.
So würde es auch funktionieren:
define schalter1machwas notify schalter1 { if ("ReadingsVal("schalter1","state", "not found") eq "0") { fhem "set B_Dose_Fenster_LED on" } }

zu 2)
ja

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm