define in einem DOIF soll reading nicht auswerten

Begonnen von hillbicks, 21 November 2016, 13:44:44

Vorheriges Thema - Nächstes Thema

hillbicks

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?

Per

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

hillbicks

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"

Beta-User

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
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

hillbicks

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

Per

({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.

hillbicks

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!