Hallo Zusammen,
ich versuche gerade reguläre Ausdrücke mit DOIF zu verwenden, bekomme jedoch eine Fehlermeldung:
Reading-Wert von Sonos:MasterPlayer:
['Sonos_Badezimmer']
DOIF-Ausschnitt:
([vccu_Btn5:?ON|OFF] and [?vccu_Btn5:virtActTrigType] eq "short_Release" and [?Sonos_Badezimmer:transportState] ne "PLAYING") (set [Sonos:MasterPlayer:\['(.*)'\]:$1] Play)
Fehler:
Wandtaster3_Btn1 DOIF: unknown expression format: \['(.*)'\]:$1
Mein Ziel war es, dass ich mir immer den Masterplayer aus dem Sonos Device auslese und den dann mit dem Schalter steuern kann.
Muss ich in DOIF anders maskieren?
Vielen Dank für eure Hiilfe und frohe Ostern! :)
Das hier ist schon mal alte Syntax für die Eventauswertung:
[vccu_Btn5:?ON|OFF]
das sollte so heute nicht mehr verwendet werden.
Willst du nur einen Teil des Readings-Wert von Sonos:MasterPlayer: verwenden oder das komplette Reading?
Wenn du das Reading komplett brauchst, dann einfach:
(set [Sonos:MasterPlayer] Play)
Hallo automatisierer,
vielen Dank für die schnelle Antwort, aber ich möchte nur einen Teil verwenden. Deshalb ja die Frage mit dem REGEX.
VG, Thomas
Zitat[Sonos:MasterPlayer:\['(.*)'\]:$1]
Du musst die regex-Angabe in Anführungszeichen setzen, also eher:
[Sonos:MasterPlayer:"\['(.*)'\]"]
$1 kannst du in dem Fall auch weglassen.
siehe:
https://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen
Hi Damian,
das mit den Anführungszeichen hatte ich auch probiert. Aber ich hatte hier die Perl-Maskierung nicht bedacht.
So geht's jetzt:
set [Sonos:MasterPlayer:"\[\'(.*)\'\]"] Play
Vielen Dank! :)
Ich habe das jetzt soweit ersetzt, aber ein Problem habe ich noch:
Wie kann ich den "transportState" des Master-Players auslesen?
So klappt es leider nicht.
([vccu_Btn5:"ON|OFF"] and [vccu_Btn5:virtActTrigType:"(short_Release)"] and [[Sonos:MasterPlayer:"\[\'(.*)\'\]"]:transportState] ne "PLAYING")
(set [Sonos:MasterPlayer:"\[\'(.*)\'\]"] Play)
DOELSEIF ([vccu_Btn5:"ON|OFF"] and [vccu_Btn5:virtActTrigType:"(short_Release)"] and [[Sonos:MasterPlayer:"\[\'(.*)\'\]"]:transportState:"(PLAYING)"])
(set [Sonos:MasterPlayer:"\[\'(.*)\'\]"] Pause)
Da kommt der Fehler:
Wandtaster3_Btn1 DOIF: wrong time format: :transportState
Hier mal eingerückt der bisher angepassete Original-Code der funktioniert.
([vccu_Btn5:"ON|OFF"] and [vccu_Btn5:virtActTrigType:"(short_Release)"] and [Sonos_Badezimmer:transportState] ne "PLAYING")
(set [Sonos:MasterPlayer:"\[\'(.*)\'\]"] Play)
DOELSEIF ([vccu_Btn5:"ON|OFF"] and [vccu_Btn5:virtActTrigType:"(short_Release)"] and [Sonos_Badezimmer:transportState:"(PLAYING)"])
(set [Sonos:MasterPlayer:"\[\'(.*)\'\]"] Pause)
[[Sonos:MasterPlayer:"\[\'(.*)\'\]"]:transportState]
ineinander schachteln geht nicht, doppelte eckige Klammern gibt's nur bei indirekten Timern
Hm... und wenn ich das richtig sehe, kann ich nur im Ausführungsteil Perlcode verwenden um mir das Reading mit ReadingsVAL(...) einzulesen.
Da ich es aber schon im Ereignisteil bräuchte, habe ich wohl ein Problem.
Dann muss ich mir wohl was mit nem Dummy basteln.
Falls es jemanden interessiert...
hier meine funktionierende Lösung:
([vccu_Btn5:"ON|OFF"] and [vccu_Btn5:virtActTrigType:"(short_Release)"]) ({my $masterPlayer = ReadingsVal("Sonos", "MasterPlayer", ""); $masterPlayer =~ s/\[\'(.*)\'\]/$1/g; {if (ReadingsVal($masterPlayer, "transportState", "") ne "PLAYING") {fhem("set [Sonos:MasterPlayer:"\[\'(.*)\'\]"] Play")} else {fhem("set [Sonos:MasterPlayer:"\[\'(.*)\'\]"] Pause")}}})
VG, Thomas