Neue Sonos-Version

Begonnen von Reinerlein, 12 März 2017, 14:53:33

Vorheriges Thema - Nächstes Thema

Reinerlein

Hallo zusammen,

nun wo die Version wieder stabil läuft, endlich der Check-In :)

Kurzform:
- Einige Problembehebungen bei instabilen Netzwerksituationen
- Relativangaben bei set CurrentTrackPosition
- Cover Downloadtimeout unter Linux-Systemen
- Readings für die Anzeige, welcher Favorit- / Playlist- / Radioeintrag gerade den Titel verursacht hat
- Reading für die Feststellung, ob gerade eine Spotifydirect-Wiedergabe aktiv ist

Außerdem habe ich im Wiki meine Umsetzung einer Sonos-Integration in FTUI beschrieben.

Hier die Änderungen im Detail:

  • NotifyFn und NotifyDev werden nun im Define des Moduls festgelegt (anstatt wie vorher im Initialize). Dadurch sollten deutlich weniger Notify-Anfragen beim Modul ankommen.
  • Es gibt nun einen Set-Befehl "RefreshShareIndex" zum Aktualisieren der Bibliothek und ein Reading "ShareIndexInProgress", welches angibt, ob eine Aktualisierung gerade in Ausführung ist.
  • Die Fehlermeldung beim Verbinden zum Device wurde um die Zieladresse erweitert.
  • Es gibt drei neue Readings, die sich auf Spotify-Direct-Play beziehen: DirectControlClientID, DirectControlIsSuspended und DirectControlAccountID
  • Man kann beim Setzen der Titelposition nun auch relative Angaben machen, also z.B. '+0:00:15' oder auch '+10%'. Geht natürlich auch mit '-'.
  • Man kann beim Setzen der Titelposition nun auch eine ganze Zahl als Sekundenangabe  machen. Dabei gehen auch Relativangaben
  • Beim Cover-Download wird nun ein Standard_Timeout von 5s verwendet, sodass ein fehlender Player keine Blockade mehr verursachen sollte. Dafür gibt es auch ein neues Attribut 'coverLoadTimeout', womit dieser Wert eingestellt werden kann. Das ganze geht nur für Nicht-Windows-Systeme, da der Timeout über einen Alarm realisiert wird.
  • Wenn während eines Subscriptions-Renews ein Timeout-Fehler auftreten sollte, wird nun der Discovery-Prozess neu angestartet, um sicherzustellen, daß der Player wieder gefunden und neu initialisiert wird.
  • In der ControlPoint.pm wurde eine Sicherheitsabfrage eingebaut, wenn total verstümmelte Pakete beim SSDP-Recover ankommen.
  • Es gibt ein neues Reading "currentEnqueuedTransportURI", welches den TransportURI des hinzugefügten Paketes enthält, aus welchem der Titel gerade abgespielt wird (z.B. der Identifier der Spotify-Playliste)
  • Es gibt ein neues Reading "currentFavouriteName", welches versucht den "currentEnqueuedTransportURI" in den Favoriten zu finden, und enthält dann den gefundenen Favoritennamen. Dazu müssen die Favoriten einmal mittels "get FavouritesWithCover" ermittelt worden sein, und im Reading "Favourites" bereitstehen.
  • Es gibt ein neues Reading "currentPlaylistName", welches versucht den "currentEnqueuedTransportURI" in den Playlisten zu finden, und enthält dann den gefundenen Playlistnamen. Dazu müssen die Playlisten einmal mittels "get PlaylistsWithCover" ermittelt worden sein, und im Reading "Playlists" bereitstehen.
  • Es gibt ein neues Reading "currentRadioName", welches versucht den "currentEnqueuedTransportURI" in den Radios zu finden, und enthält dann den gefundenen Radionamen. Dazu müssen die Radios einmal mittels "get RadiosWithCover" ermittelt worden sein, und im Reading "Radios" bereitstehen.

Falls noch Unschärfen in Bezug auf Commandref oder Wiki existieren sollten, bitte eine kurze Info an mich. Da war ziemlich viel aufzuarbeiten...

Morgen per update, ab jetzt per SVN...

Grüße
Reinerlein

DeeSPe

#1
Leider hängt sich mein FHEM seit dem Update gerade eben immer wieder beim Start auf.
Ich nehme an es liegt am Sonos Modul:
Use of uninitialized value $_[0] in concatenation (.) or string at /usr/share/perl5/XML/Parser/Lite.pm line 168, <$client> line 8.
Can't use an undefined value as a HASH reference at ./FHEM/00_SONOS.pm line 1273.

An dieser Stelle endet immer das Log.
Da hilft wohl vorerst nur ein Restore.

Gruß
Dan

EDIT: Nach Restore von 00_SONOS.pm läuft mein FHEM wieder.
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Reinerlein

Hallo Dan,

das ist schon komisch. Ich verwende gar keinen XML-Parser, da ich alles selber per regulären Ausdrücken aus den XML-Strukturen parse.
In der Zeile 1273 wird versucht, auf das Reading "Radios" zuzugreifen, und wenn dieses nicht definiert ist, wird ein sauberer Leerzustand angenommen. Etwas ähnliches passiert auch in den Zeilen 1262 und 1251 für Favoriten und Playlists.
Dieser Fehler kann eigentlich nur kommen, wenn du bereits ein Reading "Radios" hast, dort aber kein Perl-Hash drinsteht.
Wie auch immer sollte das Perl eigentlich nicht anhalten...

Was hast du denn noch alles beim Restore zurückgesetzt?

Grüße
Reiner

DeeSPe

Zitat von: Reinerlein am 13 März 2017, 08:59:52
Hallo Dan,

das ist schon komisch. Ich verwende gar keinen XML-Parser, da ich alles selber per regulären Ausdrücken aus den XML-Strukturen parse.
In der Zeile 1273 wird versucht, auf das Reading "Radios" zuzugreifen, und wenn dieses nicht definiert ist, wird ein sauberer Leerzustand angenommen. Etwas ähnliches passiert auch in den Zeilen 1262 und 1251 für Favoriten und Playlists.
Dieser Fehler kann eigentlich nur kommen, wenn du bereits ein Reading "Radios" hast, dort aber kein Perl-Hash drinsteht.
Wie auch immer sollte das Perl eigentlich nicht anhalten...

Was hast du denn noch alles beim Restore zurückgesetzt?

Grüße
Reiner

Moin Reiner,

ich habe einzig und allein die 00_SONOS.pm restored.
Danach hat FHEM wieder normal gestartet.
Leider bin ich das nächste Mal erst heute Nacht zu hause an meinem FHEM um weitere Tests/Informationen zu liefern.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

fhem-challenge

#4
Zitat von: DeeSPe am 13 März 2017, 08:12:33
Leider hängt sich mein FHEM seit dem Update gerade eben immer wieder beim Start auf.
Ich nehme an es liegt am Sonos Modul:
Use of uninitialized value $_[0] in concatenation (.) or string at /usr/share/perl5/XML/Parser/Lite.pm line 168, <$client> line 8.
Can't use an undefined value as a HASH reference at ./FHEM/00_SONOS.pm line 1273.

An dieser Stelle endet immer das Log.
Da hilft wohl vorerst nur ein Restore.

Gruß
Dan

EDIT: Nach Restore von 00_SONOS.pm läuft mein FHEM wieder.


Exakt bei mir auch. FHEM steht nach dem lade von 00_SONOS.pm ...

2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant (".977 Jazz Music") in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("1radio.mk - The Wave Smooth Jazz") in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("24 Hour Jazz") in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("ABONNI Caf\351 - Soulside Radio "...) in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("AceRadio.Net - The Smooth Jazz C"...) in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("Best Smooth Jazz") in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("Calm Radio - Smooth Jazz") in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("Chayz Jazz Lounge") in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("Chroma Radio Jazz Smooth") in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("Cool Jazz Florida") in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("GotRadio Jazz So Smooth") in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("Jazz Moods Radio") in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("LIPSapp.com SmoothFLL Radio") in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("Radio Art - Smooth Jazz") in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("Relaxing Jazz Radio") in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("Smooth 93.7") in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("Smooth Choice") in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("Smooth Jazz Buzz") in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("SmoothJazz.com Global Radio (KJA"...) in void context at (eval 558) line 1.
2017.03.13 10:49:40 1: PERL WARNING: Useless use of a constant ("The Seabreeze") in void context at (eval 558) line 1.
Can't use string ("eurosmoothjazz") as a HASH ref while "strict refs" in use at /opt/fhem/FHEM/00_SONOS.pm line 1273.




Viele Grüße!

Andreas

Reinerlein

Hi,

also, den Fehler mit dem "can't use undefined value as Hash" kann ich nachstellen, wenn ich im Reading "Radios" am Player Text stehen habe, der keinen Hash repräsentiert (ich habe z.B. einfach mal einen "." gesetzt).
Dann bricht der Bulkupdate mit der bekannten Fehlermeldung mitten drin ab...
Anscheinend mag Fhem das gar nicht, wenn da noch ein Bulkupdate unabgeschlossen ist. In meinem Fall war das Reading immer leer, oder enthielt einen gültigen Hash. In beiden Fällen klappt das :)

Ich baue da mal ein bißchen zusätzliche Prüfung ein...

Grüße
Reinerlein

Reinerlein

Hallo zusammen,

sooo, ich habe da ein Fehlerhandling drumherum gebaut, sodass Fhem nicht mehr beeinflußt werden sollte...

Ab Morgen per Update, oder ab sofort per SVN...

Grüße
Reinerlein

DeeSPe

Zitat von: Reinerlein am 13 März 2017, 14:24:58
Hallo zusammen,

sooo, ich habe da ein Fehlerhandling drumherum gebaut, sodass Fhem nicht mehr beeinflußt werden sollte...

Ab Morgen per Update, oder ab sofort per SVN...

Grüße
Reinerlein

Vielen Dank Reiner für die schnelle Erweiterung.
Werde morgen früh testen ob es funktioniert.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Masterfunk

Hallo Reiner,

habe nach Deinem Beispiel im Wiki meine FTUI Anzeige "umgebaut" und auf meine Bedürfnisse angepasst (Siehe Bild).

Das was jetzt noch fehlt, ist das sich die "Current TrackPosition" automatisch aktualisiert.
Wie kann ich das anstellen?

Gruß Detlef



Reinerlein

Hi Detlef,

ich hatte das über ein wiederkehrendes DOIF gemacht:

define Sonos_Wohnzimmer_RefreshCurrentTrackPosition DOIF ([Sonos_Wohnzimmer:transportState] eq "PLAYING" and [Sonos_Wohnzimmer:currentNormalAudio] eq 1) (get Sonos_Wohnzimmer CurrentTrackPosition) DOELSE
attr Sonos_Wohnzimmer_RefreshCurrentTrackPosition cmdState on|off
attr Sonos_Wohnzimmer_RefreshCurrentTrackPosition devStateIcon off:taster_ch_aus_rot:on on:taster_ch_an_gruen:off set_.*:ampel_gelb
attr Sonos_Wohnzimmer_RefreshCurrentTrackPosition do always
attr Sonos_Wohnzimmer_RefreshCurrentTrackPosition wait 15

Leider ist FHEM damit echt beschäftigt, sodass ich das nicht wirklich empfehlen kann.

Am Besten wäre so ein sekündlicher Javascript-Timer, mit dem man den Balken im FTUI immer eine Sekunde weiterschiebt, und wenn das Reading "currentTrackPosition" aktualisiert wird, wird die Position des Balken korrigiert.
Wenn die Wiedergabe gestoppt wird, wird der Timer angehalten (das Reading currentTrackPosition wird in diesen Momenten nochmal korrekt aktualisiert).

Leider kenne ich mich da zuwenig aus, wie man einen Slider an ein Reading bindet und trotzdem per Javascript "weiterschiebt".

Reiner

Nobby1805

Ich habe es bei mir etwas anders formuliert und habe den Eindruck, dass die Belastung von FHEM nicht besonders hoch ist
Ich habe allerdings keine Ahnung wo der genau Unterschied liegt

define refreshPositionWohnzimmer DOIF ([+8] and [Sonos_Wohnzimmer:transportState] eq "PLAYING") (get Sonos_Wohnzimmer currentTrackPosition)
attr refreshPositionWohnzimmer do always
FHEM-Featurelevel: 6.2   (fhem.pl:28227/2023-11-29) auf Windows 10 Pro mit Strawberry Perl 5.32.1.1-32bit
TabletUI: 2.7.15
IO: 2xHMLAN(0.965)|HMUSB2(0.967)

Reinerlein

Hi Nobby,

das läuft auf das gleiche raus (halt nur mit kürzerem Intervall :) ).

Mit Belastung meinte ich die Verarbeitung der Kette:
FHEM -> SonosModul -> SonosSubProzess -> Sonosplayer -> Antwort vom Sonosplayer -> Antwort vom SonosSubProzess -> Event in FHEM

Insgesamt ist/war mein FHEM damit sehr gut Grundausgelastet, weswegen ich das erstmal wieder deaktiviert hatte...

Aber das muss ja jeder selber beurteilen und abschätzen, das kommt ja schließlich auch auf die Rahmenbedingungen wie Hardware u.ä. an...

Grüße
Reiner

DeeSPe

Moin Reiner,

hab soeben das Update installiert.
Heute gibt soweit keine offensichtliche Probleme.

Vielen Dank für den Fix.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Mitch

Also bei mir hat der Update gestern ohne Probleme geklappt, aber ich habe immer noch das Problem, dass der Sonos Dienst plötzlich (ohne das Sonos benutzt wird) auf über 50% CPU Last schießt und dann mein fhem komplett abstürzt.
FHEM im Proxmox Container

Reinerlein

Hallo Mitch,

da wirst du mal den LogLevel am Sonos-Device auf 5 stellen müssen, um zu schauen, was er eigentlich gerade versucht zu machen.
Aber Achtung: Da kommen sehr große Logdateien heraus...

Grüße
Reinerlein

Nobby1805

Hallo Mitch,

echte 50% oder looped der Prozess auf einem Kern von Zweien und das macht dann 50%?
So etwas habe ich mit Reiner auch hier diskutiert: https://forum.fhem.de/index.php/topic,62552.0.html

Ich habe nicht den LogLevel des gesamten SONOS erhöht, sondern zusätzliches Logging eingebaut, "leider" ;) tritt das Problem bei mir nur alle paar Wochen auf ... bisheriger Stand ist, dass bei der Abfrage der Kommunikation zwischen dem FHEM-Hauptprozess und dem Sonos-Subprozess angezeigt wird, dass dort etwas ist, dann aber nichts gelesen wird (weil wohl doch nichts da ist) aber bei der nächsten Abfrage sofort wieder signalisiert wird da ist etwas :(

Danach habe ich das Logging noch einmal erweitert um weitere Erkenntnisse zu gewinnen, aber das ist jetzt schon ein paar Wochen her

Gruß Nobby
FHEM-Featurelevel: 6.2   (fhem.pl:28227/2023-11-29) auf Windows 10 Pro mit Strawberry Perl 5.32.1.1-32bit
TabletUI: 2.7.15
IO: 2xHMLAN(0.965)|HMUSB2(0.967)

Nobby1805

FHEM-Featurelevel: 6.2   (fhem.pl:28227/2023-11-29) auf Windows 10 Pro mit Strawberry Perl 5.32.1.1-32bit
TabletUI: 2.7.15
IO: 2xHMLAN(0.965)|HMUSB2(0.967)

Masterfunk

Zitat von: Reinerlein am 13 März 2017, 21:28:25
Hi Detlef,

ich hatte das über ein wiederkehrendes DOIF gemacht:

define Sonos_Wohnzimmer_RefreshCurrentTrackPosition DOIF ([Sonos_Wohnzimmer:transportState] eq "PLAYING" and [Sonos_Wohnzimmer:currentNormalAudio] eq 1) (get Sonos_Wohnzimmer CurrentTrackPosition) DOELSE
attr Sonos_Wohnzimmer_RefreshCurrentTrackPosition cmdState on|off
attr Sonos_Wohnzimmer_RefreshCurrentTrackPosition devStateIcon off:taster_ch_aus_rot:on on:taster_ch_an_gruen:off set_.*:ampel_gelb
attr Sonos_Wohnzimmer_RefreshCurrentTrackPosition do always
attr Sonos_Wohnzimmer_RefreshCurrentTrackPosition wait 15

Leider ist FHEM damit echt beschäftigt, sodass ich das nicht wirklich empfehlen kann.

Am Besten wäre so ein sekündlicher Javascript-Timer, mit dem man den Balken im FTUI immer eine Sekunde weiterschiebt, und wenn das Reading "currentTrackPosition" aktualisiert wird, wird die Position des Balken korrigiert.
Wenn die Wiedergabe gestoppt wird, wird der Timer angehalten (das Reading currentTrackPosition wird in diesen Momenten nochmal korrekt aktualisiert).

Leider kenne ich mich da zuwenig aus, wie man einen Slider an ein Reading bindet und trotzdem per Javascript "weiterschiebt".

Reiner

Danke, habs noch angepasst, da bei Gruppenwiedergabe da dann Unsin angezeigt wurde:

([Sonos_Bad:transportState] eq "PLAYING" and [Sonos_Bad:currentNormalAudio] eq 1 and [Sonos_Bad:currentTitle] ne "Gruppenwiedergabe") (get Sonos_Bad CurrentTrackPosition) DOELSE

Hier noch meine HTML Dateien, es gab eine Nachfrage:

template_musik_sonos.html
<div class="top-space container cell row">
<div Class="col-3-4">

<div data-type="popup" data-width="45%" data-height="80%" class="inline">
<div data-type="image"
data-device="Device"
data-get="currentAlbumArtURL"
data-width="210px"
data-height="210px"
class="nocache">
</div>

<div class="dialog">
<header>Cover für Name</header>

<div data-type="switch"
data-device="Device"
data-get="transportState"
data-states='["PLAYING","PAUSED_PLAYBACK","STOPPED"]'
data-set-states='["Pause","Play","Play"]'
data-background-icon="-"
data-background-colors='["orange","white","white"]'
data-colors='["orange","white","white"]'
data-icons='["fa-play","fa-pause","fa-pause"]'
class="inline"
style="position: absolute; top: 25px; left: 5px;"
onclick="$('.dialog-close').trigger('click');">
</div>

<div data-type="image"
data-device="Device"
data-get="currentAlbumArtURL"
data-width="750px"
data-height="750px"
class="nocache"
onclick="$('.dialog-close').trigger('click');">
</div>

<div data-type="classchanger" data-device="Device" data-get="currentNormalAudio" data-get-on="1" data-get-off="0" data-off-class="hide">
<div data-type="slider"
data-device="Device"
data-get="currentTrackPositionSec"
data-max="currentTrackDurationSec" data-min="0"
data-step="1"
data-handle-diameter="5"
data-width="750px"
class="horizontal top-narrow readonly centered"></div>
</div>

<div data-type="classchanger" data-device="Device" data-get="currentNormalAudio" data-get-on="1" data-get-off="0" data-off-class="hide">
<div data-type="joinedlabel" data-device="Device" data-mask="[$1][ ~ $2][ ~ $3]" data-get='["currentTitle","currentArtist","currentAlbum"]' class="truncate top-space"></div>
</div>
<div data-type="classchanger" data-device="Device" data-get="currentStreamAudio" data-get-on="1" data-get-off="0" data-off-class="hide">
<div data-type="joinedlabel" data-device="Device" data-mask="[$1 ~ ][$2][: $3]" data-get='["currentSenderInfo","currentSender","currentSenderCurrent"]' class="truncate top-space"></div>
</div>
</div>
</div>
</div>

<div Class="col-1-4">
    <div class="sheet">
        <div class="row">

<div data-type="switch" data-device="Device"
     data-states='["appeared","initialized","disappeared"]'
data-icons='["fa-thumbs-o-up","fa-thumbs-o-down fa-blink","fa-thumbs-o-down"]'
data-background-icons='["-","-","-"]'
     data-colors='["#aa6900","#505050","#505050"]'
     class="readonly inline small top-align">
</div>
<div data-type="switch" data-device="Switch"
     data-states='["on","off","set_on"]'
     data-set-states='["off","on","on"]'
data-icons='["fa-power-off","fa-power-off","fa-power-off fa-blink"]'
data-background-icons='["-","-","-"]'
     data-colors='["#aa6900","#505050","#aa6900"]'
     class="inline small top-align">
</div></div>
</div>
<br>
<br>
   <div data-type="label" class="inline" >Titel</div>
<div data-type="label" class="inline" data-device="Device" data-get="currentTrack"></div>
<div data-type="label" class="inline" >von</div>
   <div data-type="label" class="inline" data-device="Device" data-get="numberOfTracks"></div>
</div>

<br>
<br>
<div data-type="classchanger" data-device="Device" data-get="currentNormalAudio" data-get-on="1" data-get-off="0" data-off-class="hide">
<div data-type="label" data-device="Device" data-get="currentTrackPosition" class="inline"></div>
<div data-type="slider"
data-device="Device"
data-set="CurrentTrackPosition"
data-get="currentTrackPositionSec"
data-max="currentTrackDurationSec" data-min="0"
data-step="1"
data-handle-diameter="5"
data-width="350"
class="horizontal tap inline">
</div>
<div data-type="label" data-device="Device" data-get="currentTrackDuration" class="inline"></div>


</div>

<div data-type="classchanger" data-device="Device" data-get="currentStreamAudio" data-get-on="1" data-get-off="0" data-off-class="hide">
<div style="height: 40px;"> </div> <!-- Leerer Ersatz für die bei Streams fehlende Positionsanzeige -->
</div>

<div class="large top-space">
<div data-type="classchanger" data-device="Device" data-get="currentNormalAudio" data-get-on="1" data-get-off="0" data-off-class="hide">
<div data-type="label" data-device="Device" data-get="currentTitle" class="bold truncate" style="height: 21px;"></div>
<div data-type="joinedlabel" data-device="Device" data-mask="[$1][ ~ $2]" data-get='["currentArtist","currentAlbum"]' class="truncate" style="height: 21px;"></div>
</div>
<div data-type="classchanger" data-device="Device" data-get="currentStreamAudio" data-get-on="1" data-get-off="0" data-off-class="hide">
<div data-type="label" data-device="Device" data-get="currentSenderInfo" class="bold truncate" style="height: 21px;"></div>
<div data-type="joinedlabel" data-device="Device" data-mask="[$1][: $2]" data-get='["currentSender","currentSenderCurrent"]' class="truncate" style="height: 21px;"></div>
</div>
</div>

<div class="top-space">

<div data-type="classchanger" data-device="Device" data-get="currentNormalAudio" data-get-on="1" data-get-off="0" data-off-class="hide" class="inline top-space">
<div data-type="switch" data-device="Device" data-get="Repeat" data-set="Repeat"
data-icon="fa-repeat" data-background-icon="-"
data-on-color="#aa6900" data-off-color="gray"
data-get-on="1" data-get-off="0"
data-set-on="1" data-set-off="0" class="inline ">
</div>

<div data-type="push" data-device="Device"
data-icon="fa-step-backward" data-background-icon="-"
data-off-color="#fff" data-on-color="#aa6900"
data-set-on="Previous" class="inline ">
</div>

<div data-type="push" data-device="Device"
data-set="CurrentTrackPosition"
data-icon="fa-backward" data-background-icon="-"
data-off-color="#fff" data-on-color="#aa6900"
data-set-on="-30" class="inline ">
</div>
</div>

<div data-type="switch"
data-device="Device"
data-get="transportState"
data-states='["PLAYING","PAUSED_PLAYBACK","STOPPED"]'
data-set-states='["Pause","Play","Play"]'
data-background-icon="fa-circle-thin"
data-background-colors='["orange","white","white"]'
data-colors='["white","white","white"]'
data-icons='["fa-pause","fa-play","fa-play"]'
class="inline ">
</div>

<div data-type="classchanger" data-device="Device" data-get="currentNormalAudio" data-get-on="1" data-get-off="0" data-off-class="hide" class="inline">
<div data-type="push" data-device="Device"
data-set="CurrentTrackPosition"
data-icon="fa-forward" data-background-icon="-"
data-off-color="#fff" data-on-color="#aa6900"
data-set-on="+30" class="inline ">
</div>

<div data-type="push" data-device="Device"
data-icon="fa-step-forward" data-background-icon="-"
data-off-color="#fff" data-on-color="#aa6900"
data-set-on="Next" class="inline ">
</div>

<div data-type="switch" data-device="Device" data-get="Shuffle" data-set="Shuffle"
data-icon="fa-random" data-background-icon="-"
data-on-color="#aa6900" data-off-color="gray"
data-get-on="1" data-get-off="0"
data-set-on="1" data-set-off="0" class="inline ">
</div>
</div>

<div data-type="popup" class="inline" data-width="470px" data-height="250px">
<div data-type="push"
data-icon="fa-list-ul" data-background-icon="-"
data-off-color="#fff" data-on-color="#aa6900"
class="">
</div>

<div class="dialog">
<header>Musikauswahl für Name</header>

<div class="top-space-10 left-align left-space">
<br>
<div>
<div class="large middle inline">Favoriten: </div>
<div data-type="select"
data-device="Device"
data-list="FavouritesList"
data-alias="FavouritesListAlias"
data-delimiter="|"
data-quote="/"
data-get="currentFavouriteNameMasked"
data-set="StartFavourite"
class="inline w3x"
onchange="$('.dialog-close').trigger('click');"></div>
</div>
<br>
<div>
<div class="large middle inline">Playlists: </div>
<div data-type="select"
data-device="Device"
data-list="PlaylistsList"
data-alias="PlaylistsListAlias"
data-delimiter="|"
data-quote="/"
data-get="currentPlaylistNameMasked"
data-set="StartPlaylist"
class="inline w3x"
onchange="$('.dialog-close').trigger('click');"></div>
</div>
<br>
<div>
<div class="large middle inline">Radiosta.: </div>
<div data-type="select"
data-device="Device"
data-list="RadiosList"
data-alias="RadiosListAlias"
data-delimiter="|"
data-quote="/"
data-get="currentRadioNameMasked"
data-set="StartRadio"
class="inline w3x"
onchange="$('.dialog-close').trigger('click');"></div>
</div>
</div>
</div>
</div>
</div>

<div data-type="slider" class="inline horizontal value tap" data-device="Device"
data-get="Volume" data-set="Volume" data-min="0" data-max="100" data-width="400px"></div>

<div data-type="switch" data-device="Device" data-get="Mute" data-set="Mute"
data-icon="oa-audio_volume_mute" data-background-icon="-"
data-on-color="#aa6900" data-off-color="gray"
data-get-on="1" data-get-off="0"
data-set-on="1" data-set-off="0" class="inline ">
</div>
</div>


Und die Einbindung in der Media Seite:

<!-- ========= Sonos Kueche =============== -->
<!-- ====================================== -->
<li class="transparent50" data-row="2" data-col="1" data-sizex="4" data-sizey="4">

<header>SONOS Küche</header>
<div data-template="template_musik_sonos.html" data-parameter='{"Name":"Kueche","Device":"Sonos_Kueche","Switch":"KU_Sonos_SW_Sw"}'></div>

</li>
<!-- ========= Sonos Schlafzimmer============ -->
<!-- ====================================== -->
<li class="transparent50" data-row="6" data-col="1" data-sizex="4" data-sizey="4">

<header>SONOS Schlafzimmer</header>
<div data-template="template_musik_sonos.html" data-parameter='{"Name":"Schlafzimmer","Device":"Sonos_Schlafzimmer","Switch":"SZ_Sonos_SW_Sw"}'></div>

</li>
<!-- ========= Sonos Wohnzimmer =============== -->
<!-- ====================================== -->
<li class="transparent50" data-row="2" data-col="5" data-sizex="4" data-sizey="4">

<header>SONOS Wohnzimmer</header>
<div data-template="template_musik_sonos.html" data-parameter='{"Name":"Wohnzimmer","Device":"Sonos_Wohnzimmer","Switch":"WZ_Sonos_SW"}'></div>

</li>
<!-- ========= Sonos Bad ================== -->
<!-- ====================================== -->
<li class="transparent50" data-row="6" data-col="5" data-sizex="4" data-sizey="4">

<header>SONOS Bad</header>
<div data-template="template_musik_sonos.html" data-parameter='{"Name":"Bad","Device":"Sonos_Bad","Switch":"BZ_Sonos_SW"}'></div>

</li>


Werd mir mal ansehen, wie die Belastung des Systems so ist.

Gruß Detlef

Masterfunk

Seit der Umstellung habe ich folgendes Problem.

Beim Gruppieren bzw. Degruppieren wernde die Player nicht mehr aktualisiert.
Sprich, die alten Cover und Trackinformationen werden weiterhin angezeigt.
Erst nach einem Refresh der Seite gehts wieder.

Susätzlich bekomme ich (allerdings nur beim Gruppieren) folgende Fehlermeldung.

DeeSPe

Ich habe soeben nach Update und "shutdown restart" Folgendes im Log gefunden:
2017-03-16 07:58:25 Global global ATTR fl_Sonos model Sonos_S1
2017-03-16 07:58:26 Global global ATTR wz_Sonos model Sonos_S6
2017.03.16 07:58:29 1 : SONOS0: Error during retreiving of RadioName: Can't use an undefined value as a HASH reference at ./FHEM/00_SONOS.pm line 1287.
2017-03-16 07:58:30 Global global ATTR ku_Sonos model Sonos_S3
2017-03-16 07:58:32 Global global ATTR bz_Sonos model Sonos_S12
2017-03-16 07:58:32 Global global ATTR sz_Sonos model Sonos_S12
2017.03.16 07:58:34 1 : SONOS0: Error during retreiving of RadioName: Can't use an undefined value as a HASH reference at ./FHEM/00_SONOS.pm line 1287.


Das waren allerdings die einzigen beiden Vorkommnisse bis jetzt.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

10 min. später nochmal das Selbe:

2017.03.16 08:08:06 1 : SONOS0: Error during retreiving of RadioName: Can't use an undefined value as a HASH reference at ./FHEM/00_SONOS.pm line 1287.
2017-03-16 08:08:08 Global global ATTR fl_Sonos model Sonos_S1
2017.03.16 08:08:08 1 : SONOS0: Error during retreiving of RadioName: Can't use an undefined value as a HASH reference at ./FHEM/00_SONOS.pm line 1287.


Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Reinerlein

Hallo Dan,

das passiert immer dann, wenn im Reading "Radios" etwas anderes als eine Hash-Struktur mit den Informationen der verfügbaren Radiosender enhtalten ist.
Er versucht bei jedem Titel herauszufinden, ob es aktuell von einer Playlist, einem Favoriten oder einem Radiofavoriten eingefügt wurde. Damit das aber nicht in Tausenden Requests an den Player (mit entsprechendem Aktualisierungsaufwand) endet, werden diese Informationen aus den verfügbaren Readings geholt.
Es gab mal Userreadings-Vorlagen, die das korrekte dort reingeschrieben haben, wenn ein "get Sonos_Player RadiosWithCovers" ausgeführt wurde (in Zukunft baue ich dafür noch eine andere Möglichkeit ein, da bin ich gerade dran).
Hast du das bei dir umgestellt? Wenn nicht, dann versuch doch einfach mal einmal einen Aufruf von "get RadiosWithCovers"...

Ich kann den Fehlerlevel gerne hochsetzen, er kommt auch nur, wenn etwas fehlerhaftes (bzw. nicht erkennbares) im Reading steht, wenn es z.B. leer ist, kommt keine Meldung.

Grüße
Reiner

DeeSPe

Ich habe ehrlich gesagt bisher gar nicht groß mit dem Modul herumgespielt.
Außer bestimmte Favoriten starten/stoppen und Gruppieren nutze ich kaum etwas von dem Modul.
Mir war diese Fehlermeldung nur aufgefallen und wollte sie melden.
Wenn es nichts Ersthaftes ist, sollte Loglevel hochsetzen reichen. ;)

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Masterfunk

Zitat von: Masterfunk am 15 März 2017, 23:27:05
Seit der Umstellung habe ich folgendes Problem.

Beim Gruppieren bzw. Degruppieren wernde die Player nicht mehr aktualisiert.
Sprich, die alten Cover und Trackinformationen werden weiterhin angezeigt.
Erst nach einem Refresh der Seite gehts wieder.

Susätzlich bekomme ich (allerdings nur beim Gruppieren) folgende Fehlermeldung.

Problem ist, nach setzen von Cors im Web Device, weg.

Gruß Detlef

Loredo

Hallo Reinerlein,


herzlichen Dank, dass du wieder Hand angelegt hast! 👍🏼
Ist es die richtige Zeit nochmals nachzufragen, ob es möglich ist eine Funktion einzubauen, dass Slave-Devices die meisten Werte seiner Master Devices übernehmen? Auch fände ich ein kombiniertes Status-Reading "stateAV" (oder ähnliches) hilfreich. Derzeit realisiere ich das ja mit 99_myutils Funktionen. Im Modul selbst wäre das alles aber besser aufgehoben.


Es geht mir dabei darum, dass die Slave-Devices sich genauso verhalten wie das Master Device bzw. deren Readings die selben Inhalte haben, damit die Anzeigen in der GUI identisch sind. Ich habe dafür auch noch folgende Funktion zum Abgleich einiger Readings wie z.B. Group*, Repeat*, Shuffle, InfoSummarize*, numberOfTracks im Einsatz:




sub mySonosUpdateSlavePlayer($) {
    my ($name) = @_;
    my $MasterPlayer = ReadingsVal($name, "MasterPlayer", $name);
    my $SlavePlayers = ReadingsVal($name, "SlavePlayer", "[]");
    my $IsMaster = ReadingsVal($name, "IsMaster", "0");


return if ($IsMaster eq "0" || $MasterPlayer ne $name );


foreach my $SlavePlayer ( @{ eval $SlavePlayers } ) {
my $SlavePlayerMaster = ReadingsVal($SlavePlayer, "MasterPlayer", $SlavePlayer);
next if($SlavePlayerMaster ne $MasterPlayer);


Log3 $name, 4, "SONOSPLAYER $name SonosUpdateSlavePlayer: Syncing readings to $SlavePlayer";


readingsBeginUpdate( $defs{$SlavePlayer} );


# sync all current* and next* readings
foreach my $reading ( keys %{ $defs{$SlavePlayerMaster}{READINGS} } ) {
next if ($reading !~ /^(current|next).*/);
my $vn = ReadingsVal($SlavePlayerMaster, $reading, "");
my $vo = ReadingsVal($defs{$SlavePlayer}, $reading, "");
readingsBulkUpdateIfChanged( $defs{$SlavePlayer}, $reading, $vn );
}


# explicitly sync some additional readings
foreach my $reading (
"GroupMute",
"GroupVolume",
"Repeat",
"RepeatOne",
"Shuffle",
"infoSummarize1",
"infoSummarize2",
"infoSummarize3",
"infoSummarize4",
"numberOfTracks",
) {
my $vn = ReadingsVal($SlavePlayerMaster, $reading, "");
my $vo = ReadingsVal($defs{$SlavePlayer}, $reading, "");
readingsBulkUpdateIfChanged( $defs{$SlavePlayer}, $reading, $vn );
}


readingsEndUpdate( $defs{$SlavePlayer}, 1);


#SONOS_ProcessInfoSummarize($SlavePlayer, \$defs{$SlavePlayer}, 'InfoSummarize1', 1);
#SONOS_ProcessInfoSummarize($SlavePlayer, \$defs{$SlavePlayer}, 'InfoSummarize2', 1);
#SONOS_ProcessInfoSummarize($SlavePlayer, \$defs{$SlavePlayer}, 'InfoSummarize3', 1);
#SONOS_ProcessInfoSummarize($SlavePlayer, \$defs{$SlavePlayer}, 'InfoSummarize4', 1);


}
}




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

Reinerlein

Hi Loredo,

ich schaue mir das mal an. Im Augenblick baue ich gerade etwas für das Ermitteln der aktuellen Abspielliste.
Ich habe etwas für das FTUI gebastelt, und da sieht es nett aus, wenn man auch eine Titelauswahl per Klappbox haben kann :)

Wenn das durch ist, würde ich da was (per Attribut steuerbares) versuchen...

Grüße
Reiner

Wichtel

Ich habe mit aktuellem FHEM auch das Problem dass mir der SONOS-UPNP-Thread abschmiert und das FHEM mitreisst.

Zusätzlich ist mir jetzt noch ein Fehler aufgefallen der wohl schon vorher bestand, aber im Forum zuletzt vor eineinhalb Jahren behandelt wurde:

Loading device description failed with error: 500 Can't connect to 192.168.49.1:55647 (timeout) at ./FHEM/00_SONOS.pm line 3922 thread 1.
Siehe https://forum.fhem.de/index.php?topic=45716.0
So wie dort, immer 4x nacheinander, und ohne dass meiner Fritzbox diese ip bekannt wäre oder irgendwas jemals von mir diesen Adressbereich verpasst bekommen hätte.

Das passiert immer 10 Min nach dem Start.
Der Absturz/hängenbleiben passiert meist so 30 Minuten bis 2 Stunden später, ohne weiteren Eintrag im Log. Auch mit Verbose des Sonos-Device auf 5.

Ich betreibe 2 Stück Sonos Play:1 als Stereopaar, also nur ein Raum und keine Gruppen.

Was soll ich dazu mal alles posten?

Ich muss den toten perl-Prozess dann mit killall -9 abschießen, ohne die -9 läuft er weiter.
Nach einem Neustart geht es dann wieder für ne Stunde oder so.

Nobby1805

Hast du Fire TV? In den Zusammenhang ist immer wieder von Problemen mit dieser IP-Adresse die Rede
FHEM-Featurelevel: 6.2   (fhem.pl:28227/2023-11-29) auf Windows 10 Pro mit Strawberry Perl 5.32.1.1-32bit
TabletUI: 2.7.15
IO: 2xHMLAN(0.965)|HMUSB2(0.967)

Wichtel

Im Netz sind ein Fire TV und ein Apple TV, aber beide im 192.168.0.-Bereich, der Fire TV unter 192.168.0.37. Sie tauchen auch nicht gesondert in den Logs als erkannt auf.

Nobby1805

Kannst du den Fire nicht mal eine Zeit entfernen um zu schauen ob sich dann etwas ändert

Wenn du im Netz nach Fire TV und der IP-Adresse suchst dann gibt es etliche Treffer, schau mal ob da irgendetwas zu deiner Situation passt

So'ne Idee die ich hätte wäre , dass die Adresse beim Einschalten vor dem DHCP verwendet wird oder dass mit dieser Adresse auf Multicast-Requests reagiert wird
FHEM-Featurelevel: 6.2   (fhem.pl:28227/2023-11-29) auf Windows 10 Pro mit Strawberry Perl 5.32.1.1-32bit
TabletUI: 2.7.15
IO: 2xHMLAN(0.965)|HMUSB2(0.967)

Masterfunk

Zitat von: Reinerlein am 18 März 2017, 15:03:17
...Im Augenblick baue ich gerade etwas für das Ermitteln der aktuellen Abspielliste.
Ich habe etwas für das FTUI gebastelt, und da sieht es nett aus, wenn man auch eine Titelauswahl per Klappbox haben kann :)...

Genau das fehlt mir noch. Wann kann man den damit rechnen?

Gruß Detlef

Reinerlein

Hi Detlef,

ich bin gerade noch dabei mein FTUI-Beispiel passend umzubauen (da kommt auch noch was für Wiedergabe-Gruppen hinzu) und natürlich zu testen :)
Leider hat das Select-Widget (zumindest bei mir unter iOS) das Problem, das nicht die korrekte Auswahl vorgegeben wird (also der Eintrag in der Liste, der vom "data-get"-Reading her aktiv sein müsste). Es ist immer das erste Element der Liste. Das ist schon bei den Favoriten usw. lästig, bei dem Gruppenaufbau, wo u.U. ja nur ein Eintrag vorhanden ist, ist das total doof...
vermutlich läuft es dafür darauf hinaus, dass ich einen Dummy-Eintrag vorweg angebe. Sowas wie "Auswahl" oder so...

Ich denke, in den nächsten Tagen. Ich bin mir nicht sicher, ob heute noch...

Grüße
Reiner

FunkOdyssey

Ich habe folgende (damals automatisch angelegte) Userreadings:

Muss ich hier nun etwas löschen?

Favourites:LastActionResult.*?GetFavouritesWithCovers.* { if (ReadingsVal("Sonos_Wohnzimmer", "LastActionResult", "") =~ m/.*?: (.*)/) { return $1; } }, Radios:LastActionResult.*?GetRadiosWithCovers.* { if (ReadingsVal("Sonos_Wohnzimmer", "LastActionResult", "") =~ m/.*?: (.*)/) { return $1; } }, Playlists:LastActionResult.*?GetPlaylistsWithCovers.* { if (ReadingsVal("Sonos_Wohnzimmer", "LastActionResult", "") =~ m/.*?: (.*)/) { return $1; } }, currentTrackPosition:LastActionResult.*?GetCurrentTrackPosition.* { if (ReadingsVal("Sonos_Wohnzimmer", "LastActionResult", "") =~ m/.*?: (.*)/) { return $1; } }

Reinerlein

Hi FunkOddyssey,

wenn du das neue Attribut nutzen willst, dann ja. Wenn du es nicht setzt, dann bleibt einfach das bisherige Verhalten (allerdings musst du dir dann ein Userreading für die neue Queue hinzufügen)...

Das steht aber in dem anderen "Neue Version"-Thread: https://forum.fhem.de/index.php/topic,69290.msg608491.html#msg608491

Grüße
Reinerlein