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

Danke. Kann ich mittlerweile auch nachvollziehen, mein Bauchgefühl sagt mir aber das es auch ohne gehen muss.

Alleine schon wg der Aussagen:

Zitat- {} in perl ist zweideutig: es kann einen Code-Block bedeuten, aber auch eine Referenz auf ein 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.

edit:

habs erstmal mit 2 Zeilen gelöst, gefällt mir am besten.

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

MadMax-FHEM

Wie geschrieben: wenn nur "Einzwas" bei der Bedingung ausgeführt werden soll (wie bei deinem [aktuellen] Beispiel), dann geht auch ohne...

ABER: wenn mehr als "Einzwas" bei SELBER BEDINGUNG ausgeführt werden soll, dann MÜSSEN die sein...

Und (in diesem Fall) sie schaden nicht und ich denke das erwähnte "Problem" schlägt (in diesem Fall) auch eher nicht/nie zu... ;)

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)

TomLee

Zitatreturn 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';

Das ist ein Denkfehler.
Mit dem oneliner-if bin ich im else-Zweig und es wird nichts ausgeführt wenn der TV an ist, ich brauch eine else-Variante, bin aber jetzt verunsichert wegen der {}, das_ist_doch_die TV-FB.

Trotz
ZitatUnd (in diesem Fall) sie schaden nicht und ich denke das erwähnte "Problem" schlägt (in diesem Fall) auch eher nicht/nie zu...

Und du machst es in myUtils_MiLight.pm ja auch nicht anders und verwendest else wie Joachim schrieb.


sub myNec32RemoteCodesHandler {
my $rcProtocol = shift;
my $rcCode = shift // return;
chop($rcProtocol);
Log3(undef, 3, "Das ist $rcProtocol $rcCode");

return if ReadingsVal('TV_Wohnzimmer','state','') eq 'on';
return fhem("saysonos ".ReadingsVal('du_remote','state','')) if $rcCode eq '0x20DF3EC1';

return fhem("set du_remote Sonos;saysonos Sonos") if $rcCode eq '0x20DF4EB1' && ReadingsVal('du_remote','state','') ne 'Sonos';
return fhem("set du_remote Licht;saysonos Licht") if $rcCode eq '0x20DF8E71' && ReadingsVal('du_remote','state','') ne 'Licht';
return fhem("set du_remote Jupiter;saysonos Jupiter") if $rcCode eq '0x20DFC639' && ReadingsVal('du_remote','state','') ne 'Jupiter';
return fhem("set du_remote Jalousie;saysonos Jalousie") if $rcCode eq '0x20DF8679' && ReadingsVal('du_remote','state','') ne 'Jalousie';

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

return fhem("set str_MQTT2_zigbee_gu10 on") if $rcCode eq '0x20DF22DD' && ReadingsVal('str_MQTT2_zigbee_gu10','state','') eq 'OFF' && ReadingsVal('du_remote','state','') eq 'Licht';
return fhem("set str_MQTT2_zigbee_gu10 off") if $rcCode eq '0x20DF22DD' && ReadingsVal('str_MQTT2_zigbee_gu10','state','') eq 'ON' && ReadingsVal('du_remote','state','') eq 'Licht';
return fhem("set str_MQTT2_zigbee_gu10 brightness ".(ReadingsVal('MQTT2_zigbee_gu10_1','brightness','')-50)) if $rcCode eq '0x20DFE01F' && ReadingsVal('du_remote','state','') eq 'Licht';
return fhem("set str_MQTT2_zigbee_gu10 brightness ".(ReadingsVal('MQTT2_zigbee_gu10_1','brightness','')+50)) if $rcCode eq '0x20DF609F' && ReadingsVal('du_remote','state','') eq 'Licht';

return fhem("set Jalousie_Siro1 close") if $rcCode eq '0x20DF827D' && ReadingsVal('du_remote','state','') eq 'Jalousie';
return fhem("set Jalousie_Siro1 open") if $rcCode eq '0x20DF02FD' && ReadingsVal('du_remote','state','') eq 'Jalousie';
return fhem("set Jalousie_Siro1 stop") if $rcCode eq '0x20DF22DD' && ReadingsVal('du_remote','state','') eq 'Jalousie';
return fhem("set Jalousie_Siro1 position 3") if $rcCode eq '0x20DFE01F' && ReadingsVal('du_remote','state','') eq 'Jalousie';
return fhem("set Jalousie_Siro1 position 30") if $rcCode eq '0x20DF609F' && ReadingsVal('du_remote','state','') eq 'Jalousie';
}

Beta-User

Zitat von: TomLee am 11 Juli 2020, 18:00:20
Und du machst es in myUtils_MiLight.pm ja auch nicht anders und verwendest else wie Joachim schrieb.
Nochmal: Ich mache auch nicht alles richtig, und je älter der Code jeweils ist, desto weniger in diese Richtung optimiert ist er ggf.. Das ist also nur ein funktionierendes Beispiel, aber nichts, was in allen Punkten "mustergültig" wäre...

Ungetestet mal eine etwas anders strukturierte Variante und exemplarisch das mit dem hash (letzter Block):
sub myNec32RemoteCodesHandler {
    my $rcProtocol = shift;
    my $rcCode = shift // return;
    chop($rcProtocol);
    Log3(undef, 3, "Das ist $rcProtocol $rcCode");
   
    return if ReadingsVal('TV_Wohnzimmer','state','') eq 'on';
    return fhem("saysonos ".ReadingsVal('du_remote','state','')) if $rcCode eq '0x20DF3EC1';
   
    return fhem("set du_remote Sonos;saysonos Sonos") if $rcCode eq '0x20DF4EB1' && ReadingsVal('du_remote','state','') ne 'Sonos';
    return fhem("set du_remote Licht;saysonos Licht") if $rcCode eq '0x20DF8E71' && ReadingsVal('du_remote','state','') ne 'Licht';
    return fhem("set du_remote Jupiter;saysonos Jupiter") if $rcCode eq '0x20DFC639' && ReadingsVal('du_remote','state','') ne 'Jupiter';
    return fhem("set du_remote Jalousie;saysonos Jalousie") if $rcCode eq '0x20DF8679' && ReadingsVal('du_remote','state','') ne 'Jalousie';
   
     if (ReadingsVal('du_remote','state','') eq 'Sonos') {
    return fhem("set Sonos_Wohnzimmer play") if $rcCode eq '0x20DF22DD' && ReadingsVal('Sonos_Wohnzimmer','state','') eq 'STOPPED';
    return fhem("set Sonos_Wohnzimmer pause") if $rcCode eq '0x20DF22DD' && ReadingsVal('Sonos_Wohnzimmer','state','') eq 'PLAYING';
    return fhem("set Sonos_Wohnzimmer VolumeD") if $rcCode eq '0x20DFE01F';
    return fhem("set Sonos_Wohnzimmer VolumeU") if $rcCode eq '0x20DF609F';
    return fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein ".('s9014','s20293','s2485','s78261')[int(rand(4))]) if $rcCode eq '0x20DF4EB1';
     }
   
     if (ReadingsVal('du_remote','state','') eq 'Licht') {
    return fhem("set str_MQTT2_zigbee_gu10 on") if $rcCode eq '0x20DF22DD' && ReadingsVal('str_MQTT2_zigbee_gu10','state','') eq 'OFF';
    return fhem("set str_MQTT2_zigbee_gu10 off") if $rcCode eq '0x20DF22DD' && ReadingsVal('str_MQTT2_zigbee_gu10','state','') eq 'ON';
    return fhem("set str_MQTT2_zigbee_gu10 brightness ".(ReadingsVal('MQTT2_zigbee_gu10_1','brightness','')-50)) if $rcCode eq '0x20DFE01F';
    return fhem("set str_MQTT2_zigbee_gu10 brightness ".(ReadingsVal('MQTT2_zigbee_gu10_1','brightness','')+50)) if $rcCode eq '0x20DF609F';
     }

     if (ReadingsVal('du_remote','state','') eq 'Jalousie') {
    my %code2command = ( '0x20DF827D' => 'close", '0x20DFE01F' => 'position 3', '0x20DF609F' => 'position 30', '0x20DF02FD' => 'open', '0x20DF22DD' => 'stop');
        my $command = $code2command{$rcCode};
    return fhem("set Jalousie_Siro1 $command");
     }
}

Vermutlich könnte man das noch weiter verfeinern, indem man auch noch hashes ineinander verschachtelt. Hier wäre aber mMn. zu prüfen, ob es nicht Sinn machen würde, gleich noch im "one-liner" zu prüfen, welchen Status dieser "Umschalt-dummy" hat und dann gleich jeweils andere subs aufzurufen - die kann man dann nämlich einfacher dahingehend generalisieren, dass z.B. das Zielgerät nicht hartvercodet im Code steht, sondern im Funktionsaufruf.

(Das ist aber Jammern auf hohem Niveau; zu wissen, wie man was löst, erfordert etwas Erfahrung, und jeder hat da seine eigenen Schwerpunkte. Ich finde es übersichtlich, wenn der Code an sich "nichts" bzw. möglichst wenig über die Geräte weiß, und man am Aufruf/der cfg zumindest grob erkennen kann, was passieren soll. Dementsprechend enthält nur die etwas spezielle Geschichte mit den Deckenlichtern in meinem Code überhaupt irgendeinen Device-Namen; der kommt in der Regel aus dem Aufruf im notify...)
Server: HP-elitedesk@Debian 12, 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

eher lehrreich wie hilfreich, Danke.




Sicher Geschmackssache aber was bevorzugt der Erfahrenere.
Zwar mehr Zeilen aber doch übersichtlicher und besser zu lesen wie in einer Zeile:

if (ReadingsVal('du_remote','state','') eq 'Jalousie') {
my %code2command = (
'0x20DF827D' => 'close',
'0x20DFE01F' => 'position 3',
'0x20DF609F' => 'position 30',
'0x20DF02FD' => 'open',
'0x20DF22DD' => 'stop');
my $command = $code2command{$rcCode};
return fhem("set Jalousie_Siro1 $command");
}

Beta-User

 :) Klar, kann und sollte man auf mehrere Zeilen verteilen (und dann ggf. noch entsprechend einrücken ::) ); genau für sowas ist es ja "geschickt", wenn es in myUtils steht... (war erst mal nur auch die Schnelle, um das Prinzip zu zeigen).

In dem Zusammenhang: Will man diese Art Hash an mehreren Stellen nutzen, kann man ihn auch auf der "höheren Ebene" definieren (also in der myUtils auf der Ebene, die auch die subs haben) oder z.B. im "data"-Hash allg. verfügbar machen (über "Initalize"). Dann wäre er für mehrere myUtils (oder direkt aus notify&Co. heraus) zu nutzen.
Server: HP-elitedesk@Debian 12, 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

Wo is mir sinnvoll erscheint bin ich am umstellen auf die "nächst höhere Ebene", klappt auch schon aber erst mal wieder deaktiviert (wenn s2m aufs Hauptsystem umzieht definiere ich mir einen toggle-setter  :P). Weil:

An dem Vorschlag
if (ReadingsVal('du_remote','state','') eq 'Jalousie')
{
my %code2command = (
'0x20DF827D' => 'close',
'0x20DFE01F' => 'position 3',
'0x20DF609F' => 'position 30',
'0x20DF02FD' => 'open',
'0x20DF22DD' => 'stop');
my $command = $code2command{$rcCode};
return fhem("set Jalousie_Siro1 $command");
}


ist ein Haken, hab ich jetzt festgestellt.

Mit
return fhem("set du_remote Jalousie;saysonos Jalousie") if $rcCode eq '0x20DF8679' && ReadingsVal('du_remote','state','') ne 'Jalousie';
hab ich bisher verhindert das bei nochmaliger Ausführung nichts passiert.

Weiß nicht wie ich es beschreiben soll, denke es ist so das in dem Hash 0x20DF8679 nicht definiert ist / keinem Kommando zugewiesen, aber ja übergeben wird, das führt dazu das iVm if (ReadingsVal('du_remote','state','') eq 'Jalousie') bei nochmaliger Betätigung ein set Jalousie_Siro1 $command ausgeführt wird, $command ist leer und es kommt logischerweise zu:

2020.07.12 16:29:54 3: set Jalousie_Siro1  : Unknown argument , choose one of ...

Man müsste zuvor prüfen ob ein Kommando auch zugewiesen ist, sonst nichts machen.
Verstehst du mich und hast eine Idee das zu umgehen?

Zitatsub myNec32RemoteCodesHandler {
    my $rcProtocol = shift;
    my $rcCode = shift // return;
    chop($rcProtocol);
   #my %gcode2cmnd = (
   #'0x20DF22DD' => 'toggle',
   #'0x20DF4EB1' => 'Sonos',
   #'0x20DF8E71' => 'Licht',
   #'0x20DFC639' => 'Jupiter',
   #'0x20DF8679' => 'Jalousie',
   #);
   #my $gcmnd = $gcode2cmnd{$rcCode};
   Log3(undef, 3, "Das ist $rcProtocol $rcCode");
   
   return if ReadingsVal('TV_Wohnzimmer','state','') eq 'on';
   return fhem("saysonos ".ReadingsVal('du_remote','state','')) if $rcCode eq '0x20DF3EC1';
   
   return fhem("set du_remote Sonos;saysonos Sonos") if $rcCode eq '0x20DF4EB1' && ReadingsVal('du_remote','state','') ne 'Sonos';
    return fhem("set du_remote Licht;saysonos Licht") if $rcCode eq '0x20DF8E71' && ReadingsVal('du_remote','state','') ne 'Licht';
    return fhem("set du_remote Jupiter;saysonos Jupiter") if $rcCode eq '0x20DFC639' && ReadingsVal('du_remote','state','') ne 'Jupiter';
    return fhem("set du_remote Jalousie;saysonos Jalousie") if $rcCode eq '0x20DF8679' && ReadingsVal('du_remote','state','') ne 'Jalousie';
   #return fhem("set du_remote $gcmnd;saysonos $gcmnd") if ReadingsVal('du_remote','state','') ne $gcmnd;
   
   
   if (ReadingsVal('du_remote','state','') eq 'Sonos') {
    return fhem("set Sonos_Wohnzimmer play") if $rcCode eq '0x20DF22DD' && ReadingsVal('Sonos_Wohnzimmer','state','') eq 'STOPPED';
    return fhem("set Sonos_Wohnzimmer pause") if $rcCode eq '0x20DF22DD' && ReadingsVal('Sonos_Wohnzimmer','state','') eq 'PLAYING';
    return fhem("set Sonos_Wohnzimmer VolumeD") if $rcCode eq '0x20DFE01F';
    return fhem("set Sonos_Wohnzimmer VolumeU") if $rcCode eq '0x20DF609F';
    return fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein ".('s9014','s20293','s2485','s78261')[int(rand(4))]) if $rcCode eq '0x20DF4EB1';
    }
   
   if (ReadingsVal('du_remote','state','') eq 'Licht') {
   return fhem("set str_MQTT2_zigbee_gu10 brightness ".(ReadingsVal('MQTT2_zigbee_gu10_1','brightness','')-50)) if $rcCode eq '0x20DFE01F';
   return fhem("set str_MQTT2_zigbee_gu10 brightness ".(ReadingsVal('MQTT2_zigbee_gu10_1','brightness','')+50)) if $rcCode eq '0x20DF609F';
   #return fhem("set str_MQTT2_zigbee_gu10 ".$gcmnd) if ReadingsVal('str_MQTT2_zigbee_gu10','state','') =~ '(OFF|ON)';
   }
   
   if (ReadingsVal('du_remote','state','') eq 'Jupiter') {
   return fhem("set MQTT2_Mi_Wecklicht brightness ".(ReadingsVal('MQTT2_Mi_Wecklicht','brightness','')-15)) if $rcCode eq '0x20DFE01F';
   return fhem("set MQTT2_Mi_Wecklicht brightness ".(ReadingsVal('MQTT2_Mi_Wecklicht','brightness','')+15)) if $rcCode eq '0x20DF609F';
   #return fhem("set MQTT2_Mi_Wecklicht ".$gcmnd) if ReadingsVal('MQTT2_Mi_Wecklicht','state','') =~ '(OFF|ON)';
   }
   
   if (ReadingsVal('du_remote','state','') eq 'Jalousie')
   {
   my %code2command = (
   '0x20DF827D' => 'close',
   '0x20DFE01F' => 'position 3',
   '0x20DF609F' => 'position 30',
   '0x20DF02FD' => 'open',
   '0x20DF22DD' => 'stop');
   my $command = $code2command{$rcCode};
   return fhem("set Jalousie_Siro1 $command");
   }

Beta-User

Ja, sowas hatte ich auch schon... Sollte gehen, wenn man vorab prüft, ob es den Wert gibt. Müßte ich aber auch nachlesen bzw. nachsehen, könnte das Stichwort "ref" sein. (Grad ist wenig Zeit)
Server: HP-elitedesk@Debian 12, 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

Zitat von: betateilchen am 26 Oktober 2020, 13:54:07
Nein, bitte nicht so. Das Konstrukt mit "if" hinter einer Anweisung sollte man nicht verwenden, wenn man mehrere Unterscheidungen treffen möchte.

Hey Beta-User,

mir gefällt es das so aufzubauen, die Aussage verwirrt mich jetzt aber etwas.
Der ganze obige Code ist doch so aufgebaut oder versteh ich was gerade nicht.


Beta-User

Jetzt bin ich verwirrt...

Ich kann diese Aussage von betateilchen zwar nachvollziehen, aber zum einen macht es einen Unterschied, ob der Code an der Stelle "endet" (return) oder eben mit weiteren Abfragen "weitergeht" (das scheint in dem anderen Thread der Fall zu sein), und zum anderen war ich hier auch der Meinung, dass man das ganze eigentlich besser über eine Hash-Zuordnung lösen sollte.

Ggf. zur Vermeidung des Problems (vor der fhem-Anweisung):
return if !$command

Im Ergebnis geht es m.E. immer um klare Strukturen im Code, und wenn betateilchen was schreibt, ist das m.E. die qualitativ deutlich bessere Quelle als das, was ich so zusammenreime ::) ...
Server: HP-elitedesk@Debian 12, 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

Hatte es so gelöst:

if $command ne ""


return if !$command
probier ich später mal aus, kann jetzt nicht.

TomLee

So war das gemeint falls das undeutlich ausgedrückt war wie ich es gelöst hatte:
return fhem("set Jalousie_Siro1 $command") if $command ne ""


Mit return if !$command klappts auch, du Fuchs du (das du das auch gleich wieder in Erinnerung hattest ::)), Danke




Zitatdass man das ganze eigentlich besser über eine Hash-Zuordnung lösen sollte.

Ja, bin aber nicht so (genau) wie du, mich verlässt die Lust auch schnell mal wieder oder hab irgendwas anderes dann im Kopf.

Ich spiel da aber wenns mich wieder mal packt weiter dran rum und setze das mit dem Hash an den Stellen wo es möglich ist noch um.

Etwas hatte ich mich noch mit beschäftigt (u.a. einen  ;D  Devicenamen übergeben) aber nicht viel und brauchen wir auch nicht weiter ausführen, keine Lust dazu zur Zeit.

So siehts aktuell jetzt aus:

sub myNec32RemoteCodesHandler {
my $sondev = shift;
my $dudev = shift;
    my $rcProtocol = shift;
    my $rcCode = shift // return;
my $name = shift;
    chop($rcProtocol);
my $dudevstate = ReadingsVal($dudev,'state','Sonos');
my $sondevstate = ReadingsVal($sondev,'state','');
my $sondevcs = ReadingsVal($sondev,'currentSender','unbekannt');
my %gcode2cmnd = (
'0x20DF4EB1' => 'Sonos',
'0x20DF8E71' => 'Licht',
'0x20DFC639' => 'Jupiter',
'0x20DF8679' => 'Jalousie',
);
my $gcmnd = $gcode2cmnd{$rcCode};

#Log3(undef, 3, "Das ist $rcProtocol $rcCode $dudevstate $dudev");

return if ReadingsVal('TV_Wohnzimmer','state','') eq 'on';
return fhem("set $dudev $gcmnd;saysonos $gcmnd") if $dudevstate ne $gcmnd && $gcmnd ne "";
return fhem("saysonos $dudevstate") if $rcCode eq '0x20DF55AA';


if ($dudevstate eq 'Sonos') {
    if ($rcCode eq '0x20DF7887') {
    my $l = ReadingsVal("$sondev","RadiosList","unknown");
         $l =~ s/\|/,/g;
         my $lvwodot  = Each($sondev, $l);
         my $lv = $lvwodot."/";
         $lvwodot =~ s/[.]/ /g;
         fhem ("saysonos es wird $lvwodot abgespielt");
         return fhem("sleep $sondev:currentAlbum:.;set $sondev StartRadio /$lv");
   
}
    if ($rcCode eq '0x20DF22DD') {
return fhem("set $sondev PlayT");
    #return fhem("set $sondev Play")  if $sondevstate eq 'STOPPED';
    #return fhem("set $sondev Pause") if $sondevstate eq 'PLAYING';
}
if ($rcCode eq '0x20DF906F') {
my $sondevmute = ReadingsVal("$sondev","Mute","0");
    return fhem("set $sondev Mute 1") if $sondevmute eq '0';
    return fhem("set $sondev Mute 0") if $sondevmute eq '1';
}

return fhem("saysonos $sondevcs") if $rcCode eq '0x20DF4EB1';
return fhem("set $sondev VolumeD") if $rcCode eq '0x20DFC03F';
return fhem("set $sondev VolumeU") if $rcCode eq '0x20DF40BF';
}

if ($dudevstate eq 'Licht') {
return fhem("set str_MQTT2_zigbee_gu10 brightness ".(ReadingsVal('MQTT2_zigbee_gu10_1','brightness','')-50)) if $rcCode eq '0x20DFE01F';
return fhem("set str_MQTT2_zigbee_gu10 brightness ".(ReadingsVal('MQTT2_zigbee_gu10_1','brightness','')+50)) if $rcCode eq '0x20DF609F';
return fhem("set str_MQTT2_zigbee_gu10 toggle") if $rcCode eq '0x20DF22DD' && ReadingsVal('str_MQTT2_zigbee_gu10','state','') =~ '(OFF|ON)';
}

if ($dudevstate eq 'Jupiter') {
return fhem("set MQTT2_Mi_Wecklicht brightness ".(ReadingsVal('MQTT2_Mi_Wecklicht','brightness','')-15)) if $rcCode eq '0x20DFE01F';
return fhem("set MQTT2_Mi_Wecklicht brightness ".(ReadingsVal('MQTT2_Mi_Wecklicht','brightness','')+15)) if $rcCode eq '0x20DF609F';
return fhem("set MQTT2_Mi_Wecklicht toggle") if $rcCode eq '0x20DF22DD' && ReadingsVal('MQTT2_Mi_Wecklicht','state','') =~ '(OFF|ON)';
}

if ($dudevstate eq 'Jalousie')
{
my %code2command = (
'0x20DF827D' => 'close',
'0x20DFE01F' => 'position 3',
'0x20DF609F' => 'position 30',
'0x20DF02FD' => 'open',
'0x20DF22DD' => 'stop',
'0x20DF40BF' => 'up_for_timer 1',
'0x20DFC03F' => 'down_for_timer 1');
my $command = $code2command{$rcCode};
return if !$command;
return fhem("set Jalousie_Siro1 $command") ;
}
}

Beta-User

Na ja, Rom wurde nicht an einem Tag erbaut, und mit "leeren" Verweisen und deren Folgen habe ich mich jüngst erst wieder solange rumgeschlagen, dass das grade "parat" war...

Vielleicht noch eine Anmerkung zu dem hier:
return fhem("set $dudev $gcmnd;saysonos $gcmnd") if $dudevstate ne $gcmnd && $gcmnd ne "";Da sollte die Reihenfolge m.E. anders herum sein, denn entweder die erste Bedingung trifft zu oder du hast die Prüfung bereits erfolglos gemacht und den Eintrag im Log, den du eigentlich mit Teil 2 vermeiden wolltest. Also besser andersrum und kürzer:
return fhem("set $dudev $gcmnd;saysonos $gcmnd") if $gcmnd && $dudevstate ne $gcmnd;

Server: HP-elitedesk@Debian 12, 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

Zitatreturn fhem("set $dudev $gcmnd;saysonos $gcmnd") if $gcmnd && $dudevstate ne $gcmnd;

Ja, Danke, funzt.



Zitat
ob der Code an der Stelle "endet" (return) oder eben mit weiteren Abfragen "weitergeht" (das scheint in dem anderen Thread der Fall zu sein)

komm da noch nicht ganz mit, nicht wichtig, aber ich habs noch nicht ganz verstanden.
Wenn mit der Angabe return der Code endet und an dem Konstrukt dann weniger auszusetzen wäre, dann könnte man die return doch einfach in dem Beispiel im andern Thread erweitern:

defmod UnautorisierteTueroeffnung.Alert notify  (SN.EG.HomeMatic.HausTuer|SN.EG.HomeMatic.TerrassenTuer):open.* {
return fhem ('set mySIP call +49[deleted_by_admin] 30 !Alarm Alarm Alarm') if (ReadingsVal("Smartphone_Anwesenheit","state","") eq "present");
return fhem ('dein Befehl für den Anruf') if (ReadingsVal("Smartphone_Anwesenheit","state","") eq "absent")
}
attr UnautorisierteTueroeffnung.Alert disabledForIntervals 09:30-09:45 06:00-08:00



Ändert die Angabe von return jetzt was an der Empfehlung "if" hinter einer Anweisung nicht zu verwenden, wenn man mehrere Unterscheidungen treffen möchte oder nicht ?




Beta-User

Zitat von: TomLee am 27 Oktober 2020, 13:55:31
Ändert die Angabe von return jetzt was an der Empfehlung "if" hinter einer Anweisung nicht zu verwenden, wenn man mehrere Unterscheidungen treffen möchte oder nicht ?
Wie gesagt: es geht um Lesbarkeit, und ein "return" ist jedenfalls mAn. immer ein klares statement zu Beginn einer Zeile, denn alles, was danach kommt, ist nicht mehr relevant (wenn die dahinterstehende Bedingung zutrifft). Von daher wird man so eine Zeile genauer lesen als andere...

Der Rest ist - wie schon geschrieben - auch eine Geschmacksfrage, bei der uU. auch noch andere Aspekte mit reinspielen, wie:
- ist die Zeile davor und danach frei; (das ist nur eine optische Frage!)
- ist die Zeile selbst eher kurz oder - wie in deinem Beispiel - eher lang...

Kurz: Code soll (halbwegs) lesbar sein, und ein hinten stehendes if ist in der Tat stets in der Gefahr, Code unlesbar zu machen.
Server: HP-elitedesk@Debian 12, 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