Sonos steuern

Begonnen von Will, 05 Januar 2013, 15:51:12

Vorheriges Thema - Nächstes Thema

Spartacus

#1605
Hallo,
habe meine alte Konfig für Sonos Speak reaktivieren wollen und bekomme nun diesen Fehler:
Speak0: MP3-Creation ERROR during combining.
Irgendetwas habe ich übersehen!

attr Sonos targetSpeakDir /media/SonosSpeak
attr Sonos targetSpeakURL \\blackberry\SonosSpeak

SMB.conf
[Global]
workgroup = fritz.box
netbios name = Blackberry
security = share
getwd cache = yes
encrypt passwords = yes

[SonosSpeak]
  comment = Audio-Files for SonosPlayer to Speak
  read only = false
  path = /media/SonosSpeak
  guest ok = yes


Spontan eine Idee, was ich beim Konfigurieren vergessen habe?
Christian

NACHTRAG:
Es sind die REchte von SonosSpeak. Wie müssen die denn gesetzt sein? Mit sudo chmod 777 /media/SonosSpeak geht es jetzt, aber das muss doch nicht sein, oder?
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Reinerlein

Hi Christian,

die Meldung besagt, dass er die Zieldatei, in das die Ausgangsdateien kopiert werden sollen, nicht zum Schreiben öffnen konnte.
Schreibrechte sind alle da? Noch Platz auf der Partition?

Ich werde diese Meldung auf jeden Fall mal erweitern, damit man besser sieht, was genau nicht geklappt hat... Das hilft dir nur jetzt nicht sofort weiter...

Konfiguration sollte aber soweit passen...

Grüße
Reiner

Spartacus

Hi Reinerlein,
ja, die Rechte waren es!
sudo chmod 777 /media/SonosSpeak
hilft, aber was muss hier den minimal konfiguriert werden!
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Reinerlein

Hi Christian,

du musst halt schauen, als was der Fhem-Prozess läuft. Dann kannst du den Ordnerbesitz an diesen User übergeben, und brauchst nur 700 (also rwx) setzen.
Da musst du dann natürlich noch schauen, als was der Sambaserver zugreift. Der braucht ja nur lesend (r) und hineinwechselnd (x) zugreifen zu können (es sei denn, du verwendest das noch für was anderes).

Notfall also ein 750, wenn du die Sambagruppe (nicht die Tänzerinnen ;D) zuordnest...

Grüße
Reiner

FrankS

Hallo zusammen,

das geht ja schnell hier.

Zitat von: Reinerlein am 09 Februar 2015, 21:15:01
wenn das von Detlef nicht funktioniert
Nein, der Fix mit der Common.pm hat nicht funktioniert.

Zitat von: Reinerlein am 09 Februar 2015, 21:15:01
, benötigen wir auf jeden Fall die Logs des SubProzesses. Die von dir geposteten Logs sind ja alle von der Ebene Fhem. Dort scheint ja zunächst alles normal zu laufen...
Vorher bitte Verbose am Sonos-Devie auf 5 setzen, damit wir auch alles zu sehen bekommen.
Verbose=5 habe ich beim Device gesetzt. Allerdings ist im Log (m.E.) nichts Neues aufgetaucht (siehe fhem_log100215.txt).
Daher habe ich den Subprozess nun manuell gestartet:
root      3430  3429  1 00:15 pts/1    00:01:10 perl /opt/fhem/FHEM/00_SONOS.pm 4711 1 1

Hier wirds spannender. Der stderr produziert hier immer wieder folgende Fehle, wenn die Verzögerung eintritt:
Odd number of elements in hash assignment at /usr/share/perl5/IO/Socket/IP.pm line 328, <$client> line 4.
Loading device description failed with error: 500 Can't connect to 10.211.55.3:2869 at /opt/fhem/FHEM/00_SONOS.pm line 3057 thread 1

Interessant ist, dass diese Fehler erst nach der Verzögerung geschrieben werden. D.h. ich klicke auf "nächsten Titel", es passiert dann z.B. 1 Minute nix und plötzlich springt Sonos zum nächsten Titel und in diesem Moment werden die Fehler geschrieben. Mit dem Klick direkt wird kein Fehler geschrieben.

Gruß
Frank

justme1968

den odd number of elements fehler hatte ich mit active perl auch. ich glaube es ist nicht sonos spezifisch.

beim debuggen habe ich dann bemerkt das sich intern in LWP im constructor die _extra_sock_opts bei jedem aufruf vermehrt haben und der hash immer länger und länger geworden ist ohne einen sinnvollen inhalt zu haben.

ich habe dann in LWP/Protocol/http.pm das $self->_extra_sock_opts($host, $port), auskommentiert und seit dem ist die meldung und das problem weg. das ist aber nur ein workaround der so lange geht wie man LWP nicht mit ssl zusammen verwendet.


die can't connect meldung hatte ebenfalls. scheinbar wird hier ein upnp device entdeckt das die weitere verarbeitung durcheinander bringt und nach und nach zu ebenfalls immer längeren verzögerungen führt.

setz mal im sonos device das ignoredIPs attribut auf die ip die der meldung auftaucht.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Spartacus

Hallo,
ich versuche mit einer Prozedur, die auf Reiners sameGroup basiert, die Membernamen einer Gruppe zu ermitteln, aber meine Perl-Kenntnisse reichen irgendwie nicht aus! Wo sind die Namen der Member versteckt? Und wie kann ich diese an mein fhem zurückgeben um sie weiter auszuwerten?

sub GroupMember($) {
my ($first) = @_;
my $groups = CommandGet(undef, SONOS_getDeviceDefHash(undef)->{NAME}.' Groups');

while ($groups =~ m/\[(.*?)\]/ig) {
my @member = split(/, /, $1);

return @member if (SONOS_isInList($first, @member));
}
return 0;
}


Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Loredo

Zitat von: Spartacus am 10 Februar 2015, 15:44:00
ich versuche mit einer Prozedur, die auf Reiners sameGroup basiert, die Membernamen einer Gruppe zu ermitteln


Dafür gibt es bereits die Funktionen SONOSPLAYER_GetMasterPlayerName() und SONOSPLAYER_GetSlavePlayerNames(), siehe http://forum.fhem.de/index.php/topic,10033.msg253852/topicseen.html#msg253852
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Spartacus

Hallo,
irgendwie funzt das bei mir nicht!
{SONOSPLAYER_GetSlavePlayerNames('OG.sz.SON.ZP_S1_L')};
sagt mir den Master ganz klar an, aber
{SONOSPLAYER_GetSlavePlayerNames('OG.sz.SON.ZP_S1_L')};
zeigt bei mir nix an.
Auch wenn ich das in eine sub verpacke, passiert nichts.
sub GroupMember($) {
my ($player) = @_;
my @groupMemberNames = SONOSPLAYER_GetSlavePlayerNames('$player');
return (@groupMemberNames);
}

Was mache ich falsch?
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Loredo

#1614
Zitat von: Spartacus am 10 Februar 2015, 16:59:10
Was mache ich falsch?


Es gibt nur eine Rückgabe, wenn der Master noch weitere Boxen in der Gruppe hat, ansonsten ist das Array leer. Steht aber auch so in der Beschreibung...
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Spartacus

Zitat von: Loredo am 10 Februar 2015, 17:01:09

Es gibt nur eine Rückgabe, wenn der Master noch weitere Boxen in der Gruppe hat, ansonsten ist das Array leer. Steht aber auch so in der Beschreibung...

Hi,
das ist mir schon Klar! Meine Gruppe besteht aus dem Master (Stereopaar Play 1 + Play 1) und einem Gruppenmitglied (Play 1).
Sieht in fhem so aus:
[OG.sz.SON.ZP_S1_L, OG.sz.SON.ZP_S1_R, OG.bz.SON.ZP_S1]
Master ist "OG.sz.SON.ZP_S1_L".

Wenn ich nun {GroupMember ('OG.sz.SON.ZP_S1_L')} mache, bekomme ich nichts zurück!
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Reinerlein

Hi Christian,

mach mal folgendes:

{ my @member = SONOSPLAYER_GetSlavePlayerNames('OG.sz.SON.ZP_S1_L'); Dumper(\@member); }
falls Fhem den Inhalt von Arrays nicht einfach so anzeigt...

Grüße
Reiner

Spartacus

#1617
Hi Reiner,
wenn ich die Semikolons verdopple, dann bekomme ich die Member angezeigt!
[
  'OG.bz.SON.ZP_S1',
  'OG.sz.SON.ZP_S1_R'
]

Was macht die Funktion "Dumper" und wie benutze ich das dann in Verbindung mit meiner Funktion?

sub GroupMemberVolume($)
{
my ($player) = @_;
foreach my $member ( SONOSPLAYER_GetSlavePlayerNames($player))
{
  fhem "set $member Volume 5 1";
}
}


Doof dabei ist noch, dass ich die Lautstärke vom rechten Kanal des Stereopaares setze, 
da dieser Player auch als Gruppenteilnehmer auftaucht. Oder man müsse irgendwie noch ".*_R" und ".*SUB" ausschließen.

Christian

NACHTRAG:
Die Funktion GroupMemberVolume funktioniert jetzt offenbar, jetzt fehlt nur noch das filtern des rechten Kanals und des SUBs. Hm, mal gucken, wie man das macht..
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Reinerlein

 hi Christian,

Dumper ist ein Perl-Modul, welches Datenstrukturen in eine Form umwandelt, die man lesen kann, aber auch mittels "eval()" wieder in eine Perl-Datenstruktur zurückverwandeln kann (solange diese nicht rekursiv ist).
Das Verwende ich intern z.B. für den Getter "RadiosWithCovers" dort wird textuell dann eine Hash-Struktur dargestellt, also lesbar in einem Reading, und wenn man sie braucht, kann man sie sich mittels eval() wieder als Perl-Struktur erzeugen...

Aber zu deinem Stereo-Problem: Am einfachsten wird es sein, das Reading "fieldType" auszulesen. Das wird immer passend zur Funktion in einem Verbund gesetzt, wenn der Player kein Master ist.
In deinem Fall sollte dort eigentlich der linke Player nix drin haben, und der rechte dann "RF".

Deine Funktion wäre also zu erweitern:

sub GroupMemberVolume($)
{
my ($player) = @_;
foreach my $member ( SONOSPLAYER_GetSlavePlayerNames($player))
{
  fhem("set $member Volume 5 1") if (ReadingsVal($member, 'fieldType', '') ne "RF");
}
}

Denk aber allgemein dran, dass in der Ergebnisliste von "GetSlavePlayerNames" der Gruppen-Master nicht mit enthalten ist... Der braucht vielleicht aber auch die Lautstärke...

Grüße
Reiner

Spartacus

Hallo Reiner,
darauf wäre ich nicht gekommen!
Habe nun ein wenig gebastelt und es scheint alles zu gehen...

Hier meine SleepTimer-Steuerung in Abhängigkeit von Wochenenden, Feiertagen und Ferien mit absenkbarer Lautstärke nach x-Minuten inkl möglicher Gruppenmitglieder.

# Sleeptimer
#
# WE steht für:
# -freitags, samstags
# -vor Feiertagen
# -vor dem 1. Schulferientag
# -während der Schulferien und bis zum vorletzten Schulferientag
#
# Übergabewerte:
# player: Sonos Player name
# ST: Dauer des Sleeptimers
# ST_we: Dauer des Sleeptimers am WE
# Vol_offset: Verzögerung für das Absenken der Lautstärke
# Vol_offset_we: Verzögerung für das Absenken der Lautstärke am WE
# Vol: neue Lautstärke
# Vol_we: neue Lautstärke an WE
#
# Aufruf
# {SleepTimer ('OG.br.SON.ZP_S3','00:10:00','00:15:00','00:01:00','00:02:00','1','3')}
#
#
#
sub SleepTimer($$$$$$$)
{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
my ($player, $ST, $ST_we, $Vol_offset, $Vol_offset_we, $Vol, $Vol_we) = @_;
if (($wday == 5) || 
     ($wday == 6) ||
     (Value("cnt.NRW.start.FerienClone.dum") == 1) ||
     ((Value("state.NRW.FerienClone.dum") == 1) && (Value("cnt.NRW.end.FerienClone.dum")!~1)) ||
     (ReadingsVal("hl.01.Feiertag.cdm","tomorrow","") !~ m/none/))
  {
   fhem ("set $player SleepTimer $ST_we");
   fhem ("define at.99.$player at +$Vol_offset_we
   set $player Volume $Vol_we 1\;;
   {GroupMemberVolume('$player','$Vol_we')}")
  }
else
  {
   fhem ("set $player SleepTimer $ST");
   fhem ("define at.99.$player at +$Vol_offset
   set $player Volume $Vol 1\;;
   {GroupMemberVolume('$player','$Vol_we')}")
  }
}


und die SUB GroupMemberVolume
sub GroupMemberVolume($$)
{
my ($player, $vol) = @_;
foreach my $member ( SONOSPLAYER_GetSlavePlayerNames($player))
{
  my $playertype = (ReadingsVal($member, 'fieldType', ''));
  fhem ("set $member Volume $vol 1") if ($playertype ne 'RF' && $playertype ne 'SW');
}
}

Danke für die Unterstützung,
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R