Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern

Begonnen von TomLee, 10 Juli 2020, 12:34:40

Vorheriges Thema - Nächstes Thema

TomLee

Hallo,

möchte den Befehl {fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein {(('s9014','s20293','s2485','s78261')[int(rand(4))])}")} in abgewandelter Form (ohne Zufall) in dem u. a. notify nutzen, er dient nur als Grundlage zu testen :P

mir gibt in der Befehlszeile ausgeführt {('s9014','s20293','s2485','s78261')[int(rand(4))]} korrekt zufällig irgendein Element zurück, bspw. s2485

{fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein {(('s9014','s20293','s2485','s78261')[int(rand(4))])}")} spielt zufällig korrekt einen Radiosender ab.

Auch ein Test mit einem dummy wird korrekt ausgeführt: {fhem("setreading du_Testy2 x {(('s9014','s20293','s2485','s78261')[int(rand(4))])}")} ohne Meldungen im Log

Warum bekomme ich in einem notify Meldungen im Log ?

defmod MQTT2_Sensorkrake_notify_1 notify MQTT2_Sensorkrake:NEC_32:.* {(ReadingsVal('TV_Wohnzimmer','state','') eq 'on') ? return :\
(($EVTPART1 eq '0x20DF4EB1') && (ReadingsVal('du_remote','state','') ne 'Sonos')) ? {fhem"set du_remote Sonos;;saysonos Sonos"} :\
$EVTPART1 eq '0x20DF8679' ? {fhem"set du_remote Jalousie;;saysonos Jalousie"} :\
(($EVTPART1 eq '0x20DF827D') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 close"} :\
(($EVTPART1 eq '0x20DF02FD') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 open"} :\
(($EVTPART1 eq '0x20DF22DD') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 stop"} : \
(($EVTPART1 eq '0x20DF22DD') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {(ReadingsVal('Sonos_Wohnzimmer','state','') eq 'STOPPED') ? fhem"set Sonos_Wohnzimmer play" : fhem"set Sonos_Wohnzimmer stop"} :\
(($EVTPART1 eq '0x20DFE01F') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem"set Sonos_Wohnzimmer VolumeD"} :\
(($EVTPART1 eq '0x20DF609F') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem"set Sonos_Wohnzimmer VolumeU"} :\
(($EVTPART1 eq '0x20DF4EB1') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein {(('s9014','s20293','s2485','s78261')[int(rand(4))])}")}:\
return;;\
}\

attr MQTT2_Sensorkrake_notify_1 room Wohnzimmer


Was will mir die Meldung mit dem anonymen Hash sagen ?

Es kommt abwechselnd nach jedem ausführen des Befehls zu folgenden Meldungen im Log, Befehl wird aber ausgeführt

einmal
2020.07.10 12:06:30 1: PERL WARNING: Use of uninitialized value in anonymous hash ({}) at (eval 18425347) line 1.
2020.07.10 12:06:30 3: eval: my $TYPE='MQTT2_DEVICE';my $EVTPART0='NEC_32:';my $NAME='MQTT2_Sensorkrake';my $EVENT='NEC_32: 0x20DF4EB1';my $EVTPART1='0x20DF4EB1';my $SELF='MQTT2_Sensorkrake_notify_1';{(ReadingsVal('TV_Wohnzimmer','state','') eq 'on') ? return :
(($EVTPART1 eq '0x20DF4EB1') && (ReadingsVal('du_remote','state','') ne 'Sonos')) ? {fhem"set du_remote Sonos;saysonos Sonos"} :
$EVTPART1 eq '0x20DF8679' ? {fhem"set du_remote Jalousie;saysonos Jalousie"} :
(($EVTPART1 eq '0x20DF827D') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 close"} :
(($EVTPART1 eq '0x20DF02FD') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 open"} :
(($EVTPART1 eq '0x20DF22DD') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 stop"} :
(($EVTPART1 eq '0x20DF22DD') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {(ReadingsVal('Sonos_Wohnzimmer','state','') eq 'STOPPED') ? fhem"set Sonos_Wohnzimmer play" : fhem"set Sonos_Wohnzimmer stop"} :
(($EVTPART1 eq '0x20DFE01F') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem"set Sonos_Wohnzimmer VolumeD"} :
(($EVTPART1 eq '0x20DF609F') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem"set Sonos_Wohnzimmer VolumeU"} :
(($EVTPART1 eq '0x20DF4EB1') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein {(('s9014','s20293','s2485','s78261')[int(rand(4))])}")}:
return;
}

2020.07.10 12:06:30 3: MQTT2_Sensorkrake_notify_1 return value: HASH(0x77b90c8)


und anschließend

2020.07.10 12:06:30 3: MQTT2_Sensorkrake_notify_1 return value: HASH(0x77b90c8)
2020.07.10 12:06:39 3: xd_vacuum: connection timeout
2020.07.10 12:06:56 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 18425381) line 1.
2020.07.10 12:06:56 1: PERL WARNING: Use of uninitialized value in anonymous hash ({}) at (eval 18425381) line 1.
2020.07.10 12:06:56 3: MQTT2_Sensorkrake_notify_1 return value: HASH(0x6fbae58)


aber zwischendurch auch mal ein:

2020.07.10 12:06:30 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 18425347) line 1.
2020.07.10 12:06:30 3: eval: my $TYPE='MQTT2_DEVICE';my $EVTPART0='NEC_32:';my $NAME='MQTT2_Sensorkrake';my $EVENT='NEC_32: 0x20DF4EB1';my $EVTPART1='0x20DF4EB1';my $SELF='MQTT2_Sensorkrake_notify_1';{(ReadingsVal('TV_Wohnzimmer','state','') eq 'on') ? return :
(($EVTPART1 eq '0x20DF4EB1') && (ReadingsVal('du_remote','state','') ne 'Sonos')) ? {fhem"set du_remote Sonos;saysonos Sonos"} :
$EVTPART1 eq '0x20DF8679' ? {fhem"set du_remote Jalousie;saysonos Jalousie"} :
(($EVTPART1 eq '0x20DF827D') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 close"} :
(($EVTPART1 eq '0x20DF02FD') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 open"} :
(($EVTPART1 eq '0x20DF22DD') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 stop"} :
(($EVTPART1 eq '0x20DF22DD') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {(ReadingsVal('Sonos_Wohnzimmer','state','') eq 'STOPPED') ? fhem"set Sonos_Wohnzimmer play" : fhem"set Sonos_Wohnzimmer stop"} :
(($EVTPART1 eq '0x20DFE01F') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem"set Sonos_Wohnzimmer VolumeD"} :
(($EVTPART1 eq '0x20DF609F') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem"set Sonos_Wohnzimmer VolumeU"} :
(($EVTPART1 eq '0x20DF4EB1') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein {(('s9014','s20293','s2485','s78261')[int(rand(4))])}")}:
return;
}


Gruß

Thomas

Beta-User

Hmm, eine tiefere Erklärung kann ich auch nicht aufbieten, aber vermutlich wäre es hilfreich, wenn du den jeweiligen "Fehler" (bzw. das warning) besser eingrenzen könntest?

Dazu könntest du das ganze einfach in eine myUtils auslagern und dann aus dem notify raus eben dann nur das übergeben, was du auch auswerten willst (das scheint $EVTPART1 zu sein, ich würde aber ggf. auch gleich andere FB-Varianten mit vorsehen...).

Dann bekommst du zumindest mal Zeilennummern, und es ist mMn. einfacher, den eigentlichen Command zusammenzubasteln...
Server: HP-T620@Debian 11, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Mit dem auslagern hab ich die Woche angetestet mit dem anderen notify und noch nicht wirklich weitergekommen.

Die myUtils und eine sub anlegen ist kein Problem, aber wie ich die Events genau übergebe bzw. besser gesagt übernehme in der Sub, weiß ich einfach nicht.

Mir ist ehrlich gesagt auch nicht klar ob ich dann weiterhin EVTPARTX nutzen kann, sry mit eigenen Funktionen in einer myUtils hab ich mich bisher einfach noch nicht wirklich beschäftigt und sonst immer nur an anderen Beispielen orientiert, auch wenn du immer und immer wieder darauf hinweist längeren Code auszulagern.

MadMax-FHEM

Geht alles ganz einfach:


define nTest notify Device:Regex {mySub($NAME,$EVENT,$EVTPART1,$EVTPART2)}


Sub:


sub mySub() # oder mit "Prototyp" sub mySub($$$$)
{
  my ($Device,$Event,$Value,$WhatEver) = @_;

#  $Device -> Name des auslösenden Devices
#  $Event -> Inhalt gesamter Event, kann mittels split etc. selbst "verarbeitet" werden
#  $Value -> EVTPART1 (muss halt vorhanden sein, sonst Fehler ;)
#  $WhatEver -> EVTPART2 (muss halt vorhanden sein, sonst Fehler ;)
}


Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Beta-User

#4
Vorab: Das ist u.a. auch die Empfehlung von anderen, allen voran Rudi (die Commandref spricht ausdrücklich von "onelinern"...).

(schade, zu spät, aber vielleicht etwas mehr Erläuterung...)

Die Hürde "wie übergebe ich Parameter?" sollte eigentlich recht einfach zu nehmen sein (den Wiki-Artikel kennst du, nehme ich an). Die Kette ist folgende:
- Jede sub stellt einen eigenen "lexical context" dar, was nichts anderes bedeutet, als dass man nicht davon ausgehen sollte, dass irgendein Parameter schon bekannt ist (es gibt wenige Ausnahmen). Ergo: Es gibt weder "automatisch" $EVENT noch $EVTPARTx in einer aufgerufenen sub.
- Daher muß man alles, was man benötigt, entweder "übergeben", oder irgendwie innerhalb der sub ermitteln.
- Ergo müßtest du hier $EVTPART1 übergeben, denn das scheint die einzige wirklich dynamische Info zu sein. Demnach würdest du die sub z.B. sinnvollerweise so aufrufen:
defmod MQTT2_Sensorkrake_notify_1 notify MQTT2_Sensorkrake:NEC_32:.* {myNec32RemoteCodesHandler($EVTPART1)}
- In der Sub brauchst du dann wieder eine Variable, den Inhalt holst du aus dem übergebenen Parameter (das "// return" bewirkt einen direkten Abbruch, falls kein Parameter übergeben wird):
sub myNec32RemoteCodesHandler {
my $rcCode = shift // return;
Und dann kannst du den kompletten Code da reinnehmen, dir die escapes sparen und mußt dabei nur $EVTPART1 durch $rcCode ersetzen.

Dasselbe für beliebige Protokoll/Code-Kombinationen:defmod MQTT2_Sensorkrake_notify_1 notify MQTT2_Sensorkrake:.* {myNec32RemoteCodesHandler($EVTPART0,$EVTPART1)}sub myNec32RemoteCodesHandler {
  my $rcProtocol = shift;
  my $rcCode = shift // return;
Der "Spaß" bei dieser Variante ist nur, dass $EVTPART0/$rcProtocol vermutlich noch den Doppelpunkt enthält. Da sollte ein "chop($rcProtocol);" helfen...

Falls du ein Beispiel suchst, wie ich das mit meiner MiLight-remote mache (da wird aber einfach $EVENT komplett übergeben): gibt irgendwo einen Thread dazu, und u.a. hier ist auch eine kleine commandref dazu drin. Die Übergabe von $EVENT finde ich auch deswegen besser, weil nicht immer $EVTPARTx existiert, und das kann dann "unschön" ausgehen (im Mindesten Fall ein log-Eintrag)...
Und zwischenzeitlich bevorzuge ich bei wenigen Parametern shift gg. der @_-Variante (Details dazu sind in der Perl-Ecke zu finden).

(EDIT: Formatierung war leicht verrutscht)
Server: HP-T620@Debian 11, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

MadMax-FHEM

Zitat von: Beta-User am 10 Juli 2020, 14:17:01
Und zwischenzeitlich bevorzuge ich bei wenigen Parametern shift gg. der @_-Variante (Details dazu sind in der Perl-Ecke zu finden).

Ja habe ich mitbekommen ;)

Vielleicht stelle ich auch irgendwann mal um...
...aber erstens ist es (bis auf "Kleinstposts" hier) MEIN Code (den norm. nur ich sehe, außer jemand will ihn explizit "haben", dann soll er sich nicht so "anstellen" ;)  )...
...ich nun mal aus einer Welt MIT Prototypen komme :)

UND (v.a.): es (für mich) viel wichtigere Dinge gibt als das jetzt komplett bei mir umzustellen (weil: entweder baue ich komplett um ODER ich mache weiter wie bisher / Mischen finde ich naja...)

Aber danke für den erneuten "Stubbs"! ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Beta-User

 ;D alles gut, wir sind ja (fast) alle noch am lernen...
(Ich habe die prototypes zwischenzeitlich wohl vollständig eliminiert und würde empfehlen, neuen Code auch nur noch ohne zu schreiben (v.a. auch im Hinblick auf Perl 7...), aber jetzt in lokalem Code größere Klimmzüge unternehmen? Oder statt @_ alles auf shift umzustellen? So nebenbei: klar, aber nicht als Selbstzweck. Das ist was anderes, wenn es um gemeinsamen Code oder - wie hier - "best practice" geht...)
Server: HP-T620@Debian 11, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

rudolfkoenig

- bei den FHEM Kommandos set und setreading gibt es die Moeglichkeit Perl-Schnipsel zu verwenden, wenn man es in {(...)} einschliesst (Stichwort Set-Magic). Wenn man aber schon in Perl ist, dann ist das sowohl ueberfluessig, wie auch ineffizient. Den ersten Ausdruck wuerde ich als fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein ".('s9014','s20293','s2485','s78261')[int(rand(4))])
schreiben.

- {} in perl ist zweideutig: es kann einen Code-Block bedeuten, aber auch eine Referenz auf ein Hash:
fhem> { my $x = { Log 1,1 };; ref $x }
HASH

Mir sind die Regel nicht klar, woran perl das Eine oder das Andere erkennt, vermutlich, wenn es zugewiesen wird, dann ist es eine Referenz.
In deinem Beispiel mit den kaskadierten ?: sind alle {} ueberfluessig, vermutlich sogar kontraproduktiv.

TomLee

Sehr cool, DANKE allen.

Für die die das nachvollziehen wollen:
sub myNec32RemoteCodesHandler {
  my $rcProtocol = shift;
  my $rcCode = shift // return;
  chop($rcProtocol);
  Log3(undef, 3, "Das ist $rcProtocol $rcCode");

  (ReadingsVal('TV_Wohnzimmer','state','') eq 'on') ? return :
  (($rcCode eq '0x20DF4EB1') && (ReadingsVal('du_remote','state','') ne 'Sonos')) ?
  fhem"set du_remote Sonos;saysonos Sonos" :

  $rcCode eq '0x20DF8679' ? fhem"set du_remote Jalousie;saysonos Jalousie" :
  (($rcCode eq '0x20DF827D') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ?
  fhem"set Jalousie_Siro1 close" :
  (($rcCode eq '0x20DF02FD') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ?
  fhem"set Jalousie_Siro1 open" :
  (($rcCode eq '0x20DF22DD') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ?
  fhem"set Jalousie_Siro1 stop" :

  (($rcCode eq '0x20DF22DD') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ?
  (ReadingsVal('Sonos_Wohnzimmer','state','') eq 'STOPPED') ? fhem"set Sonos_Wohnzimmer play" :
  fhem"set Sonos_Wohnzimmer stop" :
  (($rcCode eq '0x20DFE01F') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ?
  fhem"set Sonos_Wohnzimmer VolumeD" :
  (($rcCode eq '0x20DF609F') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ?
  fhem"set Sonos_Wohnzimmer VolumeU" :
  (($rcCode eq '0x20DF4EB1') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ?
  fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein ".('s9014','s20293','s2485','s78261')[int(rand(4))]):
  return;
}



Für die Helfer noch eine Frage/Aufgabe:

2020.07.10 16:54:30 3: Das ist NEC_32 0x20DF8679
2020.07.10 16:54:30 1: ERROR evaluating my $EVENT='NEC_32: 0x20DF8679';my $TYPE='MQTT2_DEVICE';my $EVTPART0='NEC_32:';my $NAME='MQTT2_Sensorkrake';my $SELF='MQTT2_Sensorkrake_notify_1';my $EVTPART1='0x20DF8679';{myNec32RemoteCodesHandler($EVTPART0,$EVTPART1)}
: Can't use string ("0x20DF8679") as a SCALAR ref while "strict refs" in use at ./FHEM/99_Cube_myUtils.pm line 26.

2020.07.10 16:54:30 3: MQTT2_Sensorkrake_notify_1 return value: Can't use string ("0x20DF8679") as a SCALAR ref while "strict refs" in use at ./FHEM/99_Cube_myUtils.pm line 26.

rudolfkoenig

Liegt vermutlich an dem $$ in
  $$rcCode eq '0x20DF8679' ? fhem"set du_remote Jalousie;saysonos Jalousie" :

TomLee

Da warst du aber schnell nachdem ich den Code postete hatte ich die $$ auch sofort gesehen und gleich entfernt aber nicht nochmal getestet, erst jetzt wo du schreibst. ::)

funzt

DANKE

Beta-User

 :) Schön, dass das soweit geklappt hat.

Würde aber empfehlen, den Code nochmal aufzuräumen und die if - else -Unterscheidungen irgendwie anders zu strukturieren (und statt else dann eben einige return reinzubasteln). Außerdem sollte man sich sicherheitshalber auf Perl mit Schwierigkeiten bei Einbau von prototypes vorbereiten und daher fhem-Anweisungen mit Klammern verwenden (oder "für Fortgeschrittene" direkt CommandSet/CommandSetreading & Co).

Also gleich was in der Art:
return if ReadingsVal('TV_Wohnzimmer','state','') eq 'on';
  return fhem("set du_remote Sonos;saysonos Sonos") if $rcCode eq '0x20DF4EB1' && ReadingsVal('du_remote','state','') ne 'Sonos';
[...]
if (ReadingsVal('du_remote','state','') eq 'Jalousie') {

[hier dann alle betreffenden Code-Fälle, ggf. direkt via hash-Zuordnung]
}


Zu dem terniären Operator: Ich nehme das gerne, wenn es darum geht, die Codes in den onelinern zu verkürzen, aber sobald es um längere Dinge in myUtils geht, schreibe ich lieber eine Zeile mehr und finde auch entsprechende Strukturierungen als hilfreich... Das ist u.A. ein Grund, warum ich immer mehr die Empfehlung ausspreche, Code in myUtils auszulagern. Ist einfach übersichtlicher und man kann es einfacher dokumentieren (da sind ja Kommentare in näherungsweise beliebiger Länge erlaubt, und es lohnt sich auch, darauf Aufwand zu verwenden, da man sich so dann ggf. auch in generalisiertem Code besser zurechtfindet.

(@Rudi: Wie immer, falls was verbesserungswürdig ist: her damit...)
Server: HP-T620@Debian 11, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

rudolfkoenig

Kann nicht viel hinzufuegen.
Zu beachten: beim direkten Aufruf von CommandSet & co ist cmdalias wirkungslos.

TomLee

Wie mach ich jetzt bei der if-Variante ein else ?

So mal nicht:

return fhem("set Sonos_Wohnzimmer play") if $rcCode eq '0x20DF22DD' && ReadingsVal('du_remote','state','') eq 'Sonos' && ReadingsVal('Sonos_Wohnzimmer','state','') ne 'PLAYING' else fhem("set Sonos_Wohnzimmer pause");

Oder geht das nicht und ich muss für pause den Status extra abrufen ?

MadMax-FHEM

Geht schon ;)


if($rcCode eq '0x20DF22DD' && ReadingsVal('du_remote','state','') eq 'Sonos' && ReadingsVal('Sonos_Wohnzimmer','state','') ne 'PLAYING')
{
  fhem("set Sonos_Wohnzimmer play");
}
else
{
  fhem("set Sonos_Wohnzimmer pause");
}


Jaja, die geschweiften Klammern sind unnötig...
...ich habe mir das aber angewöhnt, weil: wenn dann eine Ausführung dazu kommt (bei gleicher Bedingung) brauche ich sie (eh)...
...werden sie dann "vergessen", so passiert nicht was man wollte ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)