FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: hillbicks am 21 November 2016, 13:44:44

Titel: define in einem DOIF soll reading nicht auswerten
Beitrag von: hillbicks am 21 November 2016, 13:44:44
Hallo zusammen,

Ich hab hier folgendes Problem bei dem ich nicht so recht weiterkomme.

([entertainmentstate] eq "dradio")(set pioneer on) (set pioneer input cd) (set IT_musicbox on) (define p1 at +*00:00:02 IF ([musicbox:&PRESENT] eq "1") (delete p1, set musicbox playlist dlf)) DOELSEIF ([entertainmentstate] eq "off") (set WOL_musicbox_shutdown off) (set pioneer off)

Ich moechte die dradio playliste per mopidy Instanz starten, dafuer muss ich allerdings erst warten bis das RPi hochgefahren ist und die mopidy instanz zur Verfuegung steht. Idee war also einen at zu erstellen der alle 2 sekunden guckt ob [musicbox:&PRESENT] eq "1", dann die playlist startet und den at wieder loescht.

Das Problem ist nun aber das bei dem define nicht [musicbox:&PRESENT] im DEF von dem p1 at steht, sondern der Wert, d.h. der at guckt dann alle 2 Sekunden nach ob 0 eq 1 ist, das ist natuerlicht nicht so sinnvoll.

Die Frage daher, wie schaffe ich es das der define Befehl 1 zu 1 uebertragen wird und eben nicht ausgewertet wird?

Hat da jemand einen Tipp?
Titel: Antw:define in einem DOIF soll reading nicht auswerten
Beitrag von: Per am 21 November 2016, 14:09:00
Ich habe meine Namen immer zusammengesetzt und Perl/Fhem gemischt.
Aber eigentlich solltest du auch mit wait arbeiten können:
([entertainmentstate] eq "dradio") (
set pioneer on,
set pioneer input cd,
set IT_musicbox on
)
(
IF ([musicbox:&PRESENT] eq "1") (
delete p1, set musicbox playlist dlf
)
)
DOELSEIF ([entertainmentstate] eq "off") (
set WOL_musicbox_shutdown off,
set pioneer off
)
attr XXX wait 0,2:0
Titel: Antw:define in einem DOIF soll reading nicht auswerten
Beitrag von: hillbicks am 21 November 2016, 14:26:22
Wenn ich eine feste Zeit warte, dann weiss ich nicht ob das RPi mit der mopidy Instanz bereits verfuegbar ist. Ich kann den Befehl set musicbox playlist dlf zwar absetzen, aber der laeuft da ins Leere. Ich muss also warten bis sich der Status von der musicbox von 0 auf 1 geaendert hat.

Ich habs auch schon so probiert

([entertainmentstate] eq "dradio")(set pioneer on) (set pioneer input cd) (set IT_musicbox on) ({fhem ("define p1 at +*00:00:02 IF ([musicbox:&PRESENT] eq "1") (delete p1, set musicbox playlist dlf)")}) DOELSEIF ([entertainmentstate] eq "off") (set WOL_musicbox_shutdown off) (set pioneer off)

Da ist offenbar noch irgendwo ein Syntaxfehler drin den ich noch nicht gefunden habe, aber wenn ich mir den Error im DOIF ansehe, dann wird auch hier das Reading aufgeloest:

{fhem ("define p1 at +*00:00:02 IF (1 eq "1") (delete p1, set musicbox playlist dlf)")}: syntax error at (eval 210538) line 1, near ""define p1 at +*00:00:02 IF (1 eq "1"
Titel: Antw:define in einem DOIF soll reading nicht auswerten
Beitrag von: Beta-User am 21 November 2016, 15:27:49
Triggert die musicbox eigentlich, wenn sie in "present" wechselt? Dann müßte doch eigentlich statt des "at ..." ein "defmod notify ..." (ggf. in Verbindung mit einem at, das das Notify nach 10 Min. wieder löscht, wenn bis dahin kein Event kommt...).

Gruß, Beta-User
Titel: Antw:define in einem DOIF soll reading nicht auswerten
Beitrag von: hillbicks am 21 November 2016, 15:53:55
Zwar etwas umstaendlich, aber ich habe es jetzt per zweitem DOIF geloest.

Erster DOIF schaltet pioneer, auf den richtigen Input um und die Steckdose vom RPi ein.
([entertainmentstate] eq "dradio")(set pioneer on) (set pioneer input cd) (set IT_musicbox on) DOELSEIF ([entertainmentstate] eq "off") (set WOL_musicbox_shutdown off) (set pioneer off)

Das zweite DOIF startet dann die playlist sobald dummy auf dradio steht und musicbox present ist.

([entertainmentstate] eq "dradio" and [musicbox:&PRESENT] eq "1")(set musicbox playlist dlf)

So kann ich das Ganze dann auch noch um Spotify und eine weitere Playlist erweitern.

Interessieren wuerde es mich trotzdem, man will ja nicht dumm sterben :D
Titel: Antw:define in einem DOIF soll reading nicht auswerten
Beitrag von: Per am 21 November 2016, 17:04:41
({fhem ("define p1 at +*00:00:02 IF ([musicbox:&PRESENT] eq "1")
Problem ist, dass IF mit "[musicbox:&PRESENT]" nix anfangen kann und DOIF "[musicbox:&PRESENT]" schon ausrechnet.
Du kannst dir, wenn du eh mit Perl arbeitest, die Daten erst zur Laufzeit errechnen:
({fhem ("define p1 at +*00:00:02 IF (Readings"."Val('musicbox','PRESENT',0) eq 1)...
Aber du musst mit einfachen und doppelten Anführungszeichen arbeiten, dass hast du oben auch vergessen.
Titel: Antw:define in einem DOIF soll reading nicht auswerten
Beitrag von: hillbicks am 22 November 2016, 22:34:54
So, nachdem ich dann noch darauf reingefallen bin ein Internal und nicht das gleichnamige Reading (was aber nicht den gleichen Wert hat wie das Internal) auswerten zu muessen, habe ich nun eine funktionierende Loesung.

([musicbox:&PRESENT] eq "0" and
([entertainmentstate] eq "dradio"))
(set pioneer on, set pioneer input cd, set IT_musicbox on)
({fhem ("define p1 at +*00:00:02 IF (Internal"."Val('musicbox','PRESENT',0) eq 1)(
          delete p1, set musicbox playlist dlf
     )")})
DOELSEIF
([musicbox:&PRESENT] eq "0" and
([entertainmentstate] eq "spotify"))
(set pioneer on, set pioneer input cd, set IT_musicbox on)
({fhem ("define p1 at +*00:00:02 IF (Internal"."Val('musicbox','PRESENT',0) eq 1)(
          delete p1, set musicbox random, set musicbox playlist Discover Weekly (by spotifydiscover)
     )")})
DOELSEIF
([musicbox:&PRESENT] eq "0" and
([entertainmentstate] eq "flux"))
(set pioneer on, set pioneer input cd, set IT_musicbox on)
({fhem ("define p1 at +*00:00:02 IF (Internal"."Val('musicbox','PRESENT',0) eq 1)(
          delete p1, set musicbox playlist flux
     )")})
DOELSEIF

([musicbox:&PRESENT] eq "1" and
([entertainmentstate] eq "dradio"))
(set musicbox playlist dlf)
DOELSEIF
([musicbox:&PRESENT] eq "1" and
([entertainmentstate] eq "spotify"))
(set musicbox playlist Discover Weekly (by spotifydiscover))
DOELSEIF
([musicbox:&PRESENT] eq "1" and
([entertainmentstate] eq "flux"))
(set musicbox playlist flux)
DOELSEIF

([entertainmentstate] eq "off") (set WOL_musicbox_shutdown off, set pioneer off)


Ich danke euch vielmals fuer die Hilfe!