myUtils Array wie richtig übergeben

Begonnen von Tommi ratlos, 19 Februar 2021, 12:51:22

Vorheriges Thema - Nächstes Thema

Tommi ratlos

Hallo zusammen,

habe mir eine Funktion gebastelt um Sonos zu Gruppieren. Mir ist nicht ganz klar wie ich die Parameter elegant übergeben kann. Zur Zeit nutze ich ein Notify das so aussieht. (Wird zu testen über einen Dummy Switch ausgelöst)

defmod NTFY_runCommand notify runCommand:on {
{
#my @param = ("Sonos_Wohnzimmer","Sonos_Kueche","Sonos_Bad","Sonos_Diele","Sonos_Schlafzimmer");
my @param = ("Sonos_Kueche","Sonos_Bad","Sonos_Diele","Sonos_Schlafzimmer");
#my @param = ("Sonos_Wohnzimmer","Sonos_Bad","Sonos_Diele","Sonos_Kueche");
SonosGroups("@param");
};
fhem("set runCommand off");
}


Ich würde das gerne etwa so vereinfachen {SonosGroups(Sonos_Kueche Sonos_Bad Sonos_Diele Sonos_Schlafzimmer)};
stehe da aber auf der Leitung. Die Anzahl der Parameter ist je nach gewünschter Gruppierung unterschiedlich.

Hier die Funktion.
Benutze Array::Utils (apt-get install libarray-utils-perl)

use Array::Utils qw(:all);
sub SonosGroups($)
{
my ($group) = @_;
my @grparr = split(' ',$group);
my $master = $grparr[0];
my @slaves = devspec2array("TYPE=SONOSPLAYER:FILTER=IsBonded=0:FILTER=MasterPlayer=$master");
my $masterpl = ReadingsVal($master, "MasterPlayer", 0);

Log3('SonosGroups', 3, "SonosGroups: Param=".$group."");
Log3('SonosGroups', 3, "SonosGroups: Master=".$master."");

if(defined $defs{AT_SonosGroups}) {fhem "delete AT_SonosGroups"};

# Neuer MasterPlayer
if ($masterpl ne $master) {
fhem("set $masterpl Stop");
Log3('SonosGroups', 3, "SonosGroups: Stoppe Wiedergabe auf ".$masterpl."");
fhem("set $masterpl RemoveMember $master");
Log3('SonosGroups', 3, "SonosGroups: Entferne ".$master." aus Gruppe ".$masterpl."");
foreach my $slave (@grparr) {
if ($slave ne $master) {
fhem("set $masterpl RemoveMember $slave");
Log3('SonosGroups', 3, "SonosGroups: Entferne ".$slave." aus Gruppe ".$masterpl."");
}
}
# AT erstellen um Sonos Zeit zu gebeben
fhem("define AT_SonosGroups at +00:00:05 {SonosGroups(\"@grparr\")}");
return 0;
}

my @remove = array_minus(@slaves, @grparr);
foreach my $remove (@remove) {
Log3('SonosGroups', 3, "SonosGroups: Remove=".$remove."");
fhem("set $master RemoveMember $remove");
}

my @add = array_minus(@grparr, @slaves);
foreach my $add (@add) {
if ($add ne $master) {
Log3('SonosGroups', 3, "SonosGroups: Add=".$add."");
fhem("set $master AddMember $add");
}
}
return 0;
}


Gruß
Thomas
Pi 3 CUNX868 mit 433 Pigator.

Otto123

Hi,

wenn Du aus {SonosGroups(Sonos_Kueche Sonos_Bad Sonos_Diele Sonos_Schlafzimmer)}; das machst {SonosGroups('Sonos_Kueche','Sonos_Bad','Sonos_Diele','Sonos_Schlafzimmer')};
hast Du mit sub SonosGroups {my @grparr = @_;} ohne split Dein Array :)

Du kannst auch {SonosGroups('Sonos_Kueche Sonos_Bad Sonos_Diele Sonos_Schlafzimmer')} und selber splitten. Oder ich habe Dein Problem nicht verstanden.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Tommi ratlos

Hallo Otto,

danke das war der Stubs den ich brauchte. Hochkomma Oh mann ::)

Gruß
Thomas
Pi 3 CUNX868 mit 433 Pigator.

Otto123

Und den Prototype einfach weglassen -> ($)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Tommi ratlos

Hallo,

so geht es nicht sub SonosGroups()

Es muss schon so sein
sub SonosGroups($)

Wie sieht es aus wenn ich anstelle eines AT Jobs sleep einbaue? Blockiere ich damit FEHM. Gibt es eine andere Möglichkeit zu warten ohne FHEM zu Blockieren?

Gruß
Thomas
Pi 3 CUNX868 mit 433 Pigator.

Otto123

Moin,

ich habe nicht gesagt $ weglassen - ich habe gesagt ($) weglassen. Wie in #1 empfohlen geht es schon:
sub SonosGroups
{
my @grparr = @_;
# Alles weitere
}


Ein FHEM Befehl define AT_SonosGroups at +00:00:05 set Lamp on
ist von der Sache hier zu dem
sleep 5; set Lamp on
identisch und blockiert nicht (weil FHEM sleep).

Ein Perl sleep im Code würde blockieren.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Tommi ratlos

Hallo,

OK hatte ich nicht richtig gelesen.

Ich meinte schon ein sleep in der Funktion etwa so

while (scalar array_diff(@grparr, @slaves) != 0) {
         sleep 1;
}


habe beim suchen BlockingCall() https://wiki.fhem.de/wiki/Blocking_Call gefunden. Muss mir mal anschauen.

Nochmal Danke
Thomas
Pi 3 CUNX868 mit 433 Pigator.