FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: thinman am 19 März 2018, 08:44:11

Titel: Probleme mit IF in Notify
Beitrag von: thinman am 19 März 2018, 08:44:11
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.
Titel: Antw:Probleme mit IF in Notify
Beitrag von: Otto123 am 19 März 2018, 10:23:06
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
Titel: Antw:Probleme mit IF in Notify
Beitrag von: thinman am 19 März 2018, 10:39:13
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.
Titel: Antw:Probleme mit IF in Notify
Beitrag von: Otto123 am 19 März 2018, 10:49:11
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
Titel: Antw:Probleme mit IF in Notify
Beitrag von: Pfriemler am 19 März 2018, 13:14:51
So, zweiter Versuch:
Wieso eigentlich setreading? Reagiert das Modul da überhaupt drauf? ist nicht "set <yeelink> rgb <value>" richtiger?
Jm2c.
Titel: Antw:Probleme mit IF in Notify
Beitrag von: thinman am 19 März 2018, 13:29:09
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.

Titel: Antw:Probleme mit IF in Notify
Beitrag von: Otto123 am 19 März 2018, 13:56:59
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.
Titel: Antw:Probleme mit IF in Notify
Beitrag von: Pfriemler am 19 März 2018, 14:02:05
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.
Titel: Antw:Probleme mit IF in Notify
Beitrag von: thinman am 19 März 2018, 14:20:10
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.
Titel: Antw:Probleme mit IF in Notify
Beitrag von: Otto123 am 19 März 2018, 14:21:52
Pfriemler sein Code in #7 ist richtig mit ;; und ,
Titel: Antw:Probleme mit IF in Notify
Beitrag von: thinman am 19 März 2018, 14:50:42
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... )
Titel: Antw:Probleme mit IF in Notify
Beitrag von: Otto123 am 19 März 2018, 14:58:28
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]
Titel: Antw:Probleme mit IF in Notify
Beitrag von: thinman am 19 März 2018, 15:03:03
Wird ausgeführt. Im Event Monitor steht:
YeeLight YeeLight_Water rgb: 4f71e2

Titel: Antw:Probleme mit IF in Notify
Beitrag von: Otto123 am 19 März 2018, 15:20:04
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] )
Titel: Antw:Probleme mit IF in Notify
Beitrag von: thinman am 19 März 2018, 15:42:50
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...
Titel: Antw:Probleme mit IF in Notify
Beitrag von: Pfriemler am 19 März 2018, 15:55:06
Also: Wenn setreading die Farbe ändert, set aber nicht - ich verstehe's zwar nicht, aber was funktioniert, sollte man nehmen.
Das Komma als Trenner im Ausführungsteil ist korrekt, laut commandref. ; scheint den IF-Befehl zu beenden, so dass das setreading dann immer ausgeführt wird ...
Könnte ein Bug sein.
Und setreading scheint so ziemlich den gesamten Rest des Befehls tumb wegzuschreiben? Keine Ahnung was da schief geht.

Ändern wir in der fhem.cfg oder im DEF-Fenster? Dort hätten doppelte ; sowieso nix verloren, und in der fhem.cgf führen sie zu ganz anderen Effekten...
Titel: Antw:Probleme mit IF in Notify
Beitrag von: thinman am 19 März 2018, 19:54:04
Vielen Dank Euch beiden, wir kommen die Sache schon näher.

IF ([Y_Fire:TEST] eq "on") (sleep 0.1, setreading YeeLight_Fire rgb [Y_Color:rgb] )
alleine, funktioniert.

Ich habe früher sehr viel C-Shell Scripte geschrieben und einiges in C Programmiert, deswegen mag ich eher ein Text File zu editieren... muss ich wohl davon verabschieden.
Die bisherige Code Snippets habe ich aus der fhem.cfg rauskopiert. Ich habe jetzt Eure Vorschläge direkt im DEF Editor eingegeben und so funktioniert es auch... fast ;D
Im WEBInterface ändert sich die Farbe ordnungsgemäß aber die LEDs ändern Ihre Farbe nicht obwohl durch den Sleep Workaround (laut Reference) eigentlich so gehen musste .

Deine Vermutung Priemler mit set und setreading war richtig. In den richtigen IF-Kette funktioniert auch set ordnungsgemäß und damit werden auch die LEDs angesteuert.

Ordnungshalber hier die Definiton aus der DEF Fenster:
Y_Color.*|Y_Color:rgb:.*
IF ([Y_Fire:TEST] eq "on") (sleep 0.1, set YeeLight_Fire rgb [Y_Color:rgb] );
IF ([Y_Water:TEST] eq "on") (sleep 0.1, set YeeLight_Water rgb [Y_Color:rgb] )


Sorry für die Verwirrung durch meine nicht besonders clevere Editierungstechnik und nochmals besten Dank!
Titel: Antw:Probleme mit IF in Notify
Beitrag von: Damian am 19 März 2018, 20:23:07
Hinter sleep muss ein Semikolon und kein Komma, sonst gibt es eine Warnung und das System wird blockiert (auch 0.1 Sekunden müssen nicht sein)

hier also im DEF-Editor:

IF ([Y_Fire:TEST] eq "on") (sleep 0.1; setreading YeeLight_Fire rgb [Y_Color:rgb] )
Titel: Antw:Probleme mit IF in Notify
Beitrag von: Otto123 am 19 März 2018, 20:55:06
Keine Regel ohne Ausnahme  :o :-X :'(
Titel: Antw:Probleme mit IF in Notify
Beitrag von: Damian am 19 März 2018, 21:14:43
Zitat von: Otto123 am 19 März 2018, 20:55:06
Keine Regel ohne Ausnahme  :o :-X :'(

Hat nichts mit DOIF zu tun, sondern mit sleep ;)

Sonderregeln haben sich bald erledigt: keine Kommata, keine doppelte Klammerung, keine Attribute, kein sleep, keine waits, keine internen Abhängigkeiten usw. -> https://forum.fhem.de/index.php/topic,84969.0.html
Titel: Antw:Probleme mit IF in Notify
Beitrag von: fiedel am 20 März 2018, 06:36:49
Zitat von: Damian am 19 März 2018, 21:14:43
Hat nichts mit DOIF zu tun, sondern mit sleep ;)

Sonderregeln haben sich bald erledigt: keine Kommata, keine doppelte Klammerung, keine Attribute, kein sleep, keine waits, keine internen Abhängigkeiten usw. -> https://forum.fhem.de/index.php/topic,84969.0.html

Ist ja dann wie Alexa nur schriftlich: "DOIF fahre in 10 Minuten die Rolläden auf 50%"  ;)
Titel: Antw:Probleme mit IF in Notify
Beitrag von: Damian am 20 März 2018, 08:31:18
Zitat von: fiedel am 20 März 2018, 06:36:49
Ist ja dann wie Alexa nur schriftlich: "DOIF fahre in 10 Minuten die Rolläden auf 50%"  ;)
Leider nicht ganz, einfache Perlkenntnisse und Programmiererfahrung sind schon von Bedeutung. ;)