Sonos steuern

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

Vorheriges Thema - Nächstes Thema

strauch

So ich hab mal etwas mitgeloggt. Was mir auffällt. Der Rechner mit der IP101 ist mit Windows 8.1 versehen und der einzige damit. Wie bei Windows Vista kann man Windows 8 standardmäßig nicht anpingen, vielleicht ist das ein Problem. Erstaunlich das Windows 7 das nicht hat. Wirklich schlau bin ich aus Loglevel 5 aber auch nicht geworden.... anbei mein Log seit der Umstellung seit ca. 12 Uhr heute ist besagter 101er Rechner an..... könnte sein, das dort was von Cyberlink läuft was upnp zur Verfügung stellt....

Grüße

strauch
FHEM 5.6 VMware mit Debian. 1 CUL für FS20 und HMLAN für Homematic, HM-CC-RT-DN, HM-LC_Sw1PBU-FM, HM-LC-Bl1PBU-FM,  HM-SEC-SC, HM-SEC-SC-2, HM-LC-Sw1-Pl2, HM-Sec-RHS, ASH2200, FHT80B, S20KSE, Sonos, XBMC, FB_Callmonitor, SMLUSB, Arduino Firmata, uvm.

Reinerlein

Hi strauch,

hmm... da scheint sich dein Windows auf die UPnP-Serviceanfrage zu melden, aber reagiert dann nicht mehr auf die Detail-Anfrage des UPnP-Moduls.

Ich werde mal schauen, ob ich einfach IP Adressen zum Ignorieren angeben kann... das müsste dann aber ja auch in der Fhem-Konfiguration landen... Vielleicht kann ich ja auch irgendwo dran erkennen, dass es ein nicht ernst gemeinter Aufruf ist... naja ich bastele mal...

Aber irgendwie fehlt mir die Ausgabe des IsAlive-Checker in deinem Log. Hattest du nach dem Setzen des Loglevels einen Neustart gemacht?
U.U. wird der Loglevel-Wert dann nur für einige Teile übernommen (das läuft ja im SubModul in verschiedenen Threads ab).
Nur mit diesen Ausgaben können wir dem "verschwindenden" 150er auf die Schliche kommen...

Grüße
Reiner

strauch

#992
oje nein habe ich nicht, das werde ich sofort nachholen... Bevor du bastelst, ich schau mal was auf dem Rechner so läuft irgendwas muss ja auf dem Port sein, da es nicht mein Rechner ist, muss ich mich mal dran mogeln.... vielleicht kann ich da noch tipps geben.
Ich werde auch mal das Intel Programm direkt auf dem Rechner laufen lassen.

Edit: 2014.05.05 15:43:10 5: SONOS2: PingType: icmp
Thread 2 terminated abnormally: icmp ping requires root privilege at FHEM/00_SONOS.pm line 3329 thread 2

ok ich dachte ich hätte root...... das war wohl auf der Fritzbox... ich änder das mal....
FHEM 5.6 VMware mit Debian. 1 CUL für FS20 und HMLAN für Homematic, HM-CC-RT-DN, HM-LC_Sw1PBU-FM, HM-LC-Bl1PBU-FM,  HM-SEC-SC, HM-SEC-SC-2, HM-LC-Sw1-Pl2, HM-Sec-RHS, ASH2200, FHT80B, S20KSE, Sonos, XBMC, FB_Callmonitor, SMLUSB, Arduino Firmata, uvm.

Spartacus

Zitat von: Reinerlein am 02 Mai 2014, 14:22:25
Hi Spartacus,

das mit dem Sleep geht in die gleiche Richtung. Fhem-Intern ist das ein Timer, der nach der angegebenen Zeit den Rest des Statements ausführt.
Das bedeutet, das mein Gedankengang richtig ist: Die Readings sind einfach noch nicht fertig eingelesen...

Du könntest aber auch einfach eine kleine Prozedur in deine myUtils packen, dem du einen Parameter für den Namen des zu initialisierenden Fhem-Devices mitgibst. Diesen Parameter kannst du in einem Notify aus den Notify-Variablen ermitteln, und übergeben.
So kannst du ein einziges Notify-Event machen, welches auf z.B. "Sonos_.*:.appeared" reagiert, und dort deinen Timeraufruf eintragen. Dann hast du für alle Player mit einem Notify und einer Perl-Prozedur alles erschlagen...

Mit der Dauer der Pause, bzw. dem Abstand für den Timer musst du dann mal spielen. Ich denke, dass ein paar Sekunden reichen. Sonst kannst du dir auch ein Notify auf das globale "initialized"-Event eintragen, und dann dort alles lostreten...

Grüße
Reiner

Hallo Reiner,
danke für die Info. Kann leider keine generelle Init-Routine einbauen, da einige Player immer in einer Gruppe laufen und sich nach dem Einschalten in diese Gruppe verbinden. sollen. Deshalb brauche ich ein Init für jedes Device.....

Das mit dem global:Initialized ist mir nicht ganz klar! Ich hatte verstanden, dass sich das auf einen Neustart von fhem bezieht und m.E. unwirksam ist, wenn ein Player aus- und wieder eingesteckt wird, oder? Hier muss man doch zwingend mit dem sleep oder alternativ mit dem Makro arbeiten, oder?

Beispiel global:INITIALIZED
# Sonos Init nach 5min. alles auf Standard
# define SonosInit notify global:INITIALIZED define InitSonos at +00:05:00 {Bad_Init()}


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

Reinerlein

Hi Spartacus,

ich meinte auch eher, dass du dir in deinem Initialized (in einer Variablen oder einem Dummy-Device) merkst, dass der Init-Prozess nun durch ist, und dann erst die jeweiligen Player-Events zulässt (durch eine If-Abfrage auf diesen gespeicherten Wert am Anfang des Player-Notify).
Damit erreichst du, dass die Player nicht initialisiert werden, wenn Fhem neugestartet wurde...

Das sollte nur eine Idee "von der anderen Richtung" aus sein. Ob das besser oder schlechter ist, musst du mal ausprobieren :-)

Grüße
Reiner

strauch

@Reinerlein ich konnte am Rechner selber auch nichts finden. Weder mit dem Intel Spy noch mit nem Portscanner. Es läuft wohl Cyberlink powerdvd vielleicht macht der was.

Gesendet von meinem Nexus 4 mit Tapatalk

FHEM 5.6 VMware mit Debian. 1 CUL für FS20 und HMLAN für Homematic, HM-CC-RT-DN, HM-LC_Sw1PBU-FM, HM-LC-Bl1PBU-FM,  HM-SEC-SC, HM-SEC-SC-2, HM-LC-Sw1-Pl2, HM-Sec-RHS, ASH2200, FHT80B, S20KSE, Sonos, XBMC, FB_Callmonitor, SMLUSB, Arduino Firmata, uvm.

Spartacus

Zitat von: Reinerlein am 05 Mai 2014, 20:31:52
Hi Spartacus,

ich meinte auch eher, dass du dir in deinem Initialized (in einer Variablen oder einem Dummy-Device) merkst, dass der Init-Prozess nun durch ist, und dann erst die jeweiligen Player-Events zulässt (durch eine If-Abfrage auf diesen gespeicherten Wert am Anfang des Player-Notify).
Damit erreichst du, dass die Player nicht initialisiert werden, wenn Fhem neugestartet wurde...

Das sollte nur eine Idee "von der anderen Richtung" aus sein. Ob das besser oder schlechter ist, musst du mal ausprobieren :-)

Grüße
Reiner

Hi Reiner,
die Idee ist gut! aber ich habe es immer noch nicht richtig kappiert!
Ich merke mir mit global:INITIALIZED  in einem dummy-Device (state=1), dass fhem nun initialisiert ist. In der Sonos_Init frage ich dieses dummy device ab und durchlaufe das  "Sonos_.*:.appeared" nur, wenn das Dummy auf 1 steht.  Soweit ok!
Jetzt merkt sich fhem doch in der fhem.save den zustand der devices und läd den Zustand, wenn fhem gestartet wird. Damit wäre dann doch der Zweck verfehlt, oder? Die Variable bleibt auf "1" und "Sonos_.*:.appeared" rennt los, obwohl fhem noch nicht initialisiert ist....Das habe ich noch nicht gepeilt....oder kann man verhindern, dass der Zustand des Devices abgespeichert wird.

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

Reinerlein

Hi Spartacus,

stimmt, an der Stelle habe ich die Idee nicht weiter durchdacht gehabt.

Du könntest natürlich versuchen in dem "global:SHUTDOWN"-Event den Dummy zu löschen (oder zumindest den gemerkten Wert zurücksetzen). Vielleicht landet er dann auch nicht mehr im Save-File (in der fhem.pl sieht es zumindest vielversprechend aus)...

Grüße
Reiner

Spartacus

Hi,
ok. Ich könnte mal in den Anfängerfragen psoten, vielleicht hat noch jemand eine Idee dazu.

Aber so richtig funktioniert das mit dem initalisieren auch während des Betriebs noch nicht. Habe jetzt mehrfach mit dem sleep-Befehl gespielt und muss gestehen, dass es mehr oder weniger Zufall ist, wenn beim Einstöpseln des Büro-Sonos die Init-Befehle ausgeführt werden. Dieser Versuch (siehe Code) hier ging gerade 3 x gut und einmal schief. Das Gleiche mit sleep 10 und sleep 60. Wirklich doof ist, dass fhem tatsächlich 5 min schläft und auch das Web-Interface nicht bedienbar ist. Offenbar wird der Sleep Befehl nicht nach dem "appeared"  ausgeführt, sondern teilweise vorher..Nicht sehr zufriedenstellend das Ganze. Ich teste das mal mit dem Makro.....

Sonos_Buero:presence:.appeared
{
fhem "sleep 300";;
if (ReadingsVal ("Sonos_Buero","currentTrackURI","") eq "")
  {
   fhem "set Sonos_Buero LoadRadio WDR2%%20Ruhrgebiet";;
   fhem "set Sonos_Buero Volume 10";;
   fhem "set Sonos_Buero Treble 10";;
   fhem "set Sonos_Buero Bass 3";;
   fhem "set Sonos_Buero Balance 0";;
   fhem "set Sonos_Buero Loudness 1";;
   fhem "set Sonos_Buero LEDState 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

der-Lolo

Klingt sich dein SonosBuero denn überhaupt fehlerfrei in die bestehende Landschaft ein?
Es kann nämlich auch sein das der player Probleme beim anmelden hat bzw. verursacht...
Ist deine Sonos Landschaft verkabelt oder per W-Lan verbunden?

Spartacus

Hallo,
ja, das ist alles gut. Habe das die Tage auch noch einmal vom Sonos Support überprüfen lassen. Die Verbindungen sind top! Teilweise ist verkabelt, teilweise WLAN. Auf jeder Etage gibt es mindestens ein verkabeltes System. Die NetworkMatrix (http://<IP>:1400/support/review) ist überall grün. Das sollte eigentlich passen.

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

Spartacus

#1001
Zitat von: Reinerlein am 02 Mai 2014, 14:22:25
....
So kannst du ein einziges Notify-Event machen, welches auf z.B. "Sonos_.*:.appeared" reagiert, und dort deinen Timeraufruf eintragen. Dann hast du für alle Player mit einem Notify und einer Perl-Prozedur alles erschlagen...
....

Grüße
Reiner
Hallo,
ich bin noch immer dabei eine generelle Routine zu schreiben, die meine Player initialisiert. Mir ist noch nicht klar, wie ich das mit "Sonos_.*:.appeared" anstelle.
Wenn dieses Event ausgelöst wird, muss doch der Devicename ermittelt werden, aber wie komme ich da ran? Steht der in der Variablen $EVENT oder wie übergebe ich das an meine SON_Init().

Habe jetzt in der myUtils folgendes gebaut:
sub SON_Init($)
{
my ($txt) = @_;
# generelle Einstellungen
{fhem "set Sonos_$txt LoadRadio WDR2%20Ruhrgebiet"}
{fhem "set Sonos_$txt Volume 20"}
{fhem "set Sonos_$txt Treble 10"}
{fhem "set Sonos_$txt Bass 5"}
{fhem "set Sonos_$txt Balance 0"}
{fhem "set Sonos_$txt Loudness 1"}
{fhem "set Sonos_$txt LEDState 0"}
}
#


Danke Sparatcus

NACHTRAG:
so! habe es hingekriegt! Die Init-Routine wird 1min. verzögert ausgeführt. Sonst stürzt fhem immer bei mir ab.

Sonos_.*:.appeared
define Init_.$NAME._Later at +00:01:00
{
  SON_Init('$NAME') 
}
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

Spartacus

Hallo,
brauche aber trotzdem noch einmal Hilfe...

Sonos_.*:.appeared
define Init_.$NAME._Later at +00:00:30
{
  if (ReadingsVal ("$NAME","playerType","") eq (("S1") || ("S3") || ("ZP120")))
   {
    if (ReadingsVal ("$NAME","currentTrackURI","") eq "")
    {
     SON_Init('$NAME')
    }
   }
}


habe die Funktion ein wenig erweitert, da sonst auch die Sonos-Bridge, der Sonos-SUB mit der Grundkonfiguration bestückt würden und es dann wohl zu einem Fehler käme. Allerdings scheint die Player-Abfrage auf S1, S3 und ZP120 nicht zu gehen. Die "oder Verknüpfung ist wohl falsch. Ich finde es aber nicht. Im Logfile wird kein Fehler angezeigt.

2014.05.10 16:43:17 5: exec at command Init_.Sonos_Terrasse._Later
2014.05.10 16:43:17 5: Cmd: >{
  if (ReadingsVal ("Sonos_Terrasse","playerType","") eq (("S1") || ("S3") || ("ZP120")))
   {
    if (ReadingsVal ("Sonos_Terrasse","currentTrackURI","") eq "")
    {
     SON_Init('Sonos_Terrasse')
    }
   }
}<
2014.05.10 16:43:17 5: Triggering global (1 changes)
2014.05.10 16:43:17 5: Notify loop for global DELETED Init_.Sonos_Terrasse._Later

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

Spartacus

Hallo,
so! jetzt ist die Sache rund!
Hier das Ergebnis:

in der myUtils:
# Sound-Grundeinstellungen
#
sub SON_Init($$)
{
my ($player, $typ) = @_;
if ($typ eq "S1")
{
  {fhem "set $player LoadRadio WDR2%20Ruhrgebiet"}
  {fhem "set $player Volume 5"}
  {fhem "set $player Treble 10"}
  {fhem "set $player Bass 3"}
  {fhem "set $player Balance 0"}
  {fhem "set $player Loudness 1"}
  {fhem "set $player LEDState 0"}
}
if ($typ eq "S3")
{
  {fhem "set $player LoadRadio WDR2%20Ruhrgebiet"}
  {fhem "set $player Volume 10"}
  {fhem "set $player Treble 10"}
  {fhem "set $player Bass 3"}
  {fhem "set $player Balance 0"}
  {fhem "set $player Loudness 1"}
  {fhem "set $player LEDState 0"}
}
}
#


..und das notify im DEF-Bereich:
Sonos_.*:.appeared 
define Init_$NAME_Later at +00:00:30
{
  my $reading =(ReadingsVal ("$NAME","playerType",""));;;;
  if (($reading eq ("S1")) || ($reading eq ("S3")) || ($reading eq ("ZP120")))
  {
   if (ReadingsVal ("$NAME","currentTrackURI","") eq "")
    {
     SON_Init('$NAME', $reading)
    }
  }
}


je nach Playertyp können hier unterschiedliche Grundkonfigurationen beim Einstecken der Player geladen werden. Die Zeitverzögerung von 30sec. ist nötig, da offenbar direkt nach dem "appeard" noch keine Player - Details z.B playerTyp vorliegen. Außerdem habe ich die erfahrung gemacht, dass fhem abstürzt, wenn man die "Betankung" direkt startet.

Durch das " if (ReadingsVal ("$NAME","currentTrackURI","") eq "")" stelle ich sicher, dass hier nur bei der Trennung der Player vom Netz etwas passiert. Wird fhem neu gestartet, bleibt die Konfig der Player erhalten.

Wenn jemand es besser gelöst hat, wäre ich für Tipps dankbar!

Gruß,
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

Spartacus

Hallo,
ich brauche noch einmal Hilfe:

habe zusätzlich zum Sonos_.*:.appeared  -Event ein 2. Event angelegt.

(Sonos_Schlafzimmer | Sonos_Bad):.appeared 
define Init_SchlafzimmerGroup_Later at +00:03:00
  set Sonos Groups [Sonos_Schalzimmer, Sonos_Bad]


und zwar soll hiermit erreicht werden, dass hier sowohl auf Schlafzimmer als auch auf Bad :.appeared reagiert werden soll um die Gruppe zu bilden.
Aber das funzt nicht und im log steht kein Eintrag.

Kann jemand einen tipp geben? oder muss ich das in dem Sonos_.*:.appeared  -Event verwursten und Schlafzimmer , Bad abfragen.

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