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
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.
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?
dann so:
define schalter1machwas notify schalter1 {if (Value("schalter1") == 0) {fhem ("set B_Dose_Fenster_LED on")}}
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
?? das ist genau das gleiche...
Mach mal ein List von schalter1.
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
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.
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
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
und ist der Groschen gefallen?
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" ???
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)}
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 :-)
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
Da finde ich für mich aber die Schreibweise
define schalter1machwas notify schalter1 { if ("ReadingsVal("schalter1","state", "not found") eq "0") { fhem "set B_Dose_Fenster_LED on" } }
wesentlich logischer. Erst "die Bedingung" und dann "mach was".
Danke noch einmal für deine Hilfe ;D
Gruß Jens
Hat sich der Erfinder von Perl auch gedacht.
In der Umgangsprache heißt es doch auch:
Zitatgeh nach Hause, wenn es 8 Uhr ist.
oder
Zitatwenn es 8:00 Uhr ist, geh nach Hause, denn es ist Feierabend, ansonsten musst du noch arbeiten
if .. then .. else ;)
Und wenn es kein "ansonsten" gibt, ist die Kurzschreibweise mit dem if hinten dran, einfacher und kürzer. Das ganze funktioniert ja auch mit "unless" etc.
@fh555: besser so:
define schalter1machwas notify schalter1.(0|1) { fhem "set B_Dose_Fenster_LED ".($EVENT==0 ? "off" : "on") }
das erste Argument des notifys ist ein regulärer Ausdruck. Mit dem kannst Du den gewünschten Event genau passend rausfiltern, dann reagiert das notify nicht sinnlos auf die Transmission-state Änderungen und braucht den neuen Wert von 'state' auch nicht per ReadingsVal auslesen (weil er ja eh schon mit dem Event mitkommt).
Gruß,
Norbert