Hauptmenü

Probleme mit IF in Notify

Begonnen von thinman, 19 März 2018, 08:44:11

Vorheriges Thema - Nächstes Thema

thinman

Servus, ich habe leider grosse Probleme mit der Sysntax in Fhem.
Ich habe eine ColorWheel in FTUI um ein RGB Wert zu generieren.
Abhängig davon ob Dummys (Switch in FTUI)  auf "on" stehen, möchte ich diese RGB Wert zu jeweils einen Yeelight Lampe zuweisen.
Das klappt aber überhaupt nicht. Das Notify wird zwar ausgelöst aber der Wert in der Yeelight ändert sich nicht.
Im event monitor (Verbose 5) kommt Folgende Meldung:

2018-03-19 08:27:17 dummy Y_Color rgb: eb5359
2018-03-19 08:27:18 YeeLight YeeLight_Fire rgb: Bareword "eb539f" not allowed while "strict subs" in use at (eval 236110) line 1.  ))

Als "casual user" der nicht täglich mit FHEM zu tun hat, bin ich mit der Befehlstruktur völlig überfordert.
Kann mir jemand helfen, wie ich IF zu definieren habe?

Hier ist die Definition für die LEDs und Dummys:

define YeeLight_Water YeeLight 192.168.100.23
attr YeeLight_Water DbLogExclude .*
attr YeeLight_Water devStateIcon {my $power=ReadingsVal($name,"power","off");;my $mode=ReadingsVal($name,"color_mode","RGB");;if($power eq "off"){Color::devStateIcon($name,"rgb","rgb","power");;}else{if($mode eq "RGB"){Color::devStateIcon($name,"rgb","rgb","bright");;}elsif($mode eq "color temperature"){Color::devStateIcon($name,"rgb",undef,"bright");;}}}
attr YeeLight_Water room YeeLight
attr YeeLight_Water webCmd rgb:bright:ct:rgb ffffff:rgb ff0000:rgb 00ff00:rgb 0000ff:on:off
attr YeeLight_Water widgetOverride bright:colorpicker,BRI,0,1,100 ct:colorpicker,CT,1700,10,6500 rgb:colorpicker,RGB

define YeeLight_Fire YeeLight 192.168.100.130
attr YeeLight_Fire DbLogExclude .*
attr YeeLight_Fire devStateIcon {my $power=ReadingsVal($name,"power","off");;my $mode=ReadingsVal($name,"color_mode","RGB");;if($power eq "off"){Color::devStateIcon($name,"rgb","rgb","power");;}else{if($mode eq "RGB"){Color::devStateIcon($name,"rgb","rgb","bright");;}elsif($mode eq "color temperature"){Color::devStateIcon($name,"rgb",undef,"bright");;}}}
attr YeeLight_Fire room YeeLight
attr YeeLight_Fire webCmd rgb:bright:ct:rgb ffffff:rgb ff0000:rgb 00ff00:rgb 0000ff:on:off
attr YeeLight_Fire widgetOverride bright:colorpicker,BRI,0,1,100 ct:colorpicker,CT,1700,10,6500 rgb:colorpicker,RGB

define Y_Water dummy
attr Y_Water event-on-change-reading .*
attr Y_Water readingList TEST
attr Y_Water room YeeLight
attr Y_Water setList TEST:on,off

define Y_Fire dummy
attr Y_Fire event-on-change-reading .*
attr Y_Fire readingList TEST
attr Y_Fire room YeeLight
attr Y_Fire setList TEST:on,off

define Y_Color dummy
attr Y_Color event-on-change-reading .*
attr Y_Color readingList rgb
attr Y_Color room YeeLight
attr Y_Color setList rgb


Hier ist die Definition des Notifys:

define Notify_Y_Color notify Y_Color.*|Y_Color:rgb:.* \
IF ([Y_Fire:TEST] eq "on") ((sleep 0.1 ;; setreading YeeLight_Fire rgb {([Y_Color:rgb])} ))\
IF ([Y_Water:TEST] eq "on") ((sleep 0.1 ;; setreading YeeLight_Water rgb {([Y_Color:rgb])} ))
attr Notify_Y_Color room YeeLight


Vielen Dank.

Otto123

Hi,

IF ist ein FHEM Befehl und FHEM Befehle sind in der definition mit ;; zu trennen.
Also IF()();;IF()() usw.

Dies Fehlt in Deinem notify. Es sollte aber Fehlermeldungen geben?

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

thinman

Oh, stimmt. Habe ich vergessen. Vielen Dank.

Das einzige Fehlermeldung was ich bekomme ist das Bareword Meldung, was ich geschrieben habe.
Diese ganze Fehlermeldung steht auch in der rgb Reading des LEDs. :-\

Ich habe schon versucht {([Y_Color:rgb])} )) mit {(["Y_Color:rgb"])} )) zu ersetzen aber dann steht ein ARRAY im Wert.
Ich kapiere die verschiedene Ebenen nicht...  Der Auswertung von Y_Color:rgb Reading ist ein Perl Befehl und offensichtlich kann der übergeordnete FHEM IF Befehl mit der zurückgegebene Wert nichts anfangen.
Ich verstehe nur nicht warum.

Otto123

#3
Ich denke der Ausdruck ist falsch: {([Y_Color:rgb])}
Edit: Stimmt nicht
Hab ich vorhin nicht gesehen, dass macht nur so Sinn Es ist so lediglich einfacher: [Y_Color:rgb]

Dein Konstrukt brauchst Du nur wenn in der Klammer noch gerechnet werden soll. Es geht so [Y_Color:rgb] oder so {([Y_Color:rgb])}
Nachzulesen in der Doku unter dem Begriff set magic  ;D

Ich denke das eigentliche Problem ist wirklich das was drin steht in dem Dummy, das wird nicht akzeptiert.

Wenn der Wert in Anführungsstrichen stehen muss: eventuell so  "[Y_Color:rgb]" ???
Sonst poste mal ein list YeeLight_Fire

Und ein Klammern Paar im Ausführungsteil ist auch zuviel, macht im besten Fall nichts  ;)

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

Pfriemler

So, zweiter Versuch:
Wieso eigentlich setreading? Reagiert das Modul da überhaupt drauf? ist nicht "set <yeelink> rgb <value>" richtiger?
Jm2c.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

thinman

Vielen Dank Otto!
Genau da bin ich durcheinander gekommen. Ich habe ein Beispiel aus der CommandREF falsch interpretiert.
Da ging es auch darum mit ein Readingsvalue zu rechnen und ich dachte, sobald man ein nicht Standard Readingsvalue (STATE) auslesen will (auch ohne damit zu rechnen), muss es zwangsläufig Perl sein.

Das ist mein geänderte Notify:
define Notify_Y_Color notify Y_Color.*|Y_Color:rgb:.* \
IF ([Y_Fire:TEST] eq "on") (sleep 0.1 ;; setreading YeeLight_Fire rgb [Y_Color:rgb]);;\
IF ([Y_Water:TEST] eq "on") (sleep 0.1 ;; setreading YeeLight_Water rgb [Y_Color:rgb])


Jetzt gibt es zwei Probleme:
- Das IF wird irgendwie ignoriert. Das Farbwechsel wird vollzogen unabhängig davon ob Y_Fire:TEST und Y_Water:TEST on oder off ist.
- YeeLight_Fire (das eigentliche LED) ändert seine Farbe (zumindest im WEBInterface, das LED sehe ich nicht) aber im Reading unter rgb steht: 566b9c)  Also eine Klammer zu viel.

@Pfriemler
Ich dachte set geht nur ohne einen Reading, also nur STATE wird dadurch geändert.


Otto123

Ja sorry, da hab ich auch wieder nicht dran gedacht:
ZitatMehrerer Befehle werden durch ein Komma statt durch ein Semikolon getrennt, dadurch entfällt das Doppeln, Vervierfachen usw. des Semikolons:

Eine Eigenheit von IF und DOIF  ::)

Deswegen steht da auch der Wert mit Klammer.. Du musst nur INNERHALB der IF Klammern im Ausführungsteil die ;; durch ein , ersetzen.
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

Pfriemler

Noch ne platte Idee: Teste mal ein Leerzeichen hinter der ].
define Notify_Y_Color notify Y_Color.*|Y_Color:rgb:.* \
IF ([Y_Fire:TEST] eq "on") (sleep 0.1, setreading YeeLight_Fire rgb [Y_Color:rgb] );;\
IF ([Y_Water:TEST] eq "on") (sleep 0.1, setreading YeeLight_Water rgb [Y_Color:rgb] )


und zum Set: Wenn Du ein reading eines Devices änderst, wird die Darstellung in FHEM geändert. Das bedeutet aber nicht, dass die Lampe den Wert mitgeteilt bekommt. Das passiert i.d.R. nur über einen set-Befehl.
Yeelink besitzt dafür die Methode rgb. Idealerweise wird der Wert rgb anschließend durch das Modul geändert, entweder blind oder nach Rückmeldung der Yeelink, das weiß ich nicht.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

thinman

Zitat von: Otto123 am 19 März 2018, 13:56:59
Ja sorry, da hab ich auch wieder nicht dran gedacht:
Eine Eigenheit von IF und DOIF  ::)

Deswegen steht da auch der Wert mit Klammer.. Du musst nur INNERHALB der IF Klammern im Ausführungsteil die ;; durch ein , ersetzen.

Sorry Otto, jetzt bin ich komplett durcheinander... :( Könntest Du in mein Notify Code die , und ;; berichtigen? Danke. (Ich blick nicht mehr durch.)

@Pfriemler
Die Idee hatte ich auch  :D  Es nimmt dann die ) mit den Leerzeichen. Komischer weise stellt es aber im WEB Interface die Farbe richtig da. Wahrscheinlich erwartet es 6 Charakters und der rest wandert in die Tonne. Wenn es nur diese "Schönheitsfehler" wäre, könnte ich damit leben.
Im Commandref für setreading steht genau was Du geschrieben hast (kein Event) und als Workaround wird deswegen der Sleep empfohlen.

Ich habe jetzt ausprobiert: set YeeLight_Fire rgb [Y_Color:rgb] funktioniert nicht. Die Farbe ändert sich dann nicht.

Otto123

Pfriemler sein Code in #7 ist richtig mit ;; und ,
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

thinman

#10
Sicher?
Wenn ich es so schreibe wie im #7 wird die Farbe nicht übernommen. Schreibe ich statt , ein ; hinter sleep 0.1 funktioniert die Farbzuweisung wieder nur das IF wird ignoriert.
(Egal ob die TEST Readings On or OFF sind, die Farbänderung wird immer ausgeführt als wäre der IF gar nicht da.)

Nochwas:
Wenn ich es wie im #7 nur mit ; statt , schreibe, steht im Yeelight_Fire unter rgb:
566b9c ); IF (off eq "on") (sleep 0.1
(Also der ausgewertete ([Y_Water:TEST] eq "on") , weil diese tatsächlich auf OFF stand.  Irgendwie passen die Delimiter Charaktere nicht oder ich mache etwas gewaltig falsch... )

Otto123

Ich bin mir sicher mit dem , und den ;;

Was passiert wenn Du diesen Befehl in die FHEM Kommandozeile wirfst?setreading YeeLight_Water rgb [Y_Color:rgb]
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

thinman

Wird ausgeführt. Im Event Monitor steht:
YeeLight YeeLight_Water rgb: 4f71e2


Otto123

Du kannst alles einzeln Step by Step testen.
Was macht wenn on ist?IF ([Y_Fire:TEST] eq "on") (sleep 0.1, setreading YeeLight_Fire rgb [Y_Color:rgb] )
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

thinman

Ich Probiere es von Zuhause, heute Abend aus. Ich hab zwar hier 4G aber mit der Handy ist es dennoch sehr mühselig.
Auf jeden Fall besten Dank für Dein Geduld! Ich meld mich später...