FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: ToM_ToM am 16 April 2017, 12:40:01

Titel: DOIF Rexex Maskierung von eckigen Klammern
Beitrag von: ToM_ToM am 16 April 2017, 12:40:01
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! :)
Titel: Antw:DOIF Rexex Maskierung von eckigen Klammern
Beitrag von: automatisierer am 16 April 2017, 13:05:50
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)


Titel: Antw:DOIF Rexex Maskierung von eckigen Klammern
Beitrag von: ToM_ToM am 16 April 2017, 14:04:27
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
Titel: Antw:DOIF Rexex Maskierung von eckigen Klammern
Beitrag von: Damian am 16 April 2017, 15:13:27
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
Titel: Antw:DOIF Rexex Maskierung von eckigen Klammern
Beitrag von: ToM_ToM am 16 April 2017, 15:23:04
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! :)
Titel: Antw:DOIF Rexex Maskierung von eckigen Klammern
Beitrag von: ToM_ToM am 16 April 2017, 15:47:15
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)
Titel: Antw:DOIF Rexex Maskierung von eckigen Klammern
Beitrag von: Damian am 16 April 2017, 16:23:45
[[Sonos:MasterPlayer:"\[\'(.*)\'\]"]:transportState]

ineinander schachteln geht nicht, doppelte eckige Klammern gibt's nur bei indirekten Timern
Titel: Antw:DOIF Rexex Maskierung von eckigen Klammern
Beitrag von: ToM_ToM am 16 April 2017, 17:28:20
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.
Titel: Antw:DOIF Rexex Maskierung von eckigen Klammern
Beitrag von: ToM_ToM am 23 April 2017, 12:27:34
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