FHEM Forum

FHEM - Anwendungen => Multimedia => Thema gestartet von: Loredo am 02 Januar 2015, 12:39:44

Titel: Sonos: Feedback zur Modulentwicklung
Beitrag von: Loredo am 02 Januar 2015, 12:39:44
Hallo Reinerlein,

ich bin über die Feiertage nun zu einem ersten recht ausführlichen Testen der SONOS Module gekommen.
Vorab: Hut ab für die viele Entwicklungsarbeit, es passiert da wirklich eine Menge im Hintergrund auf Protokollebene und die Einbindung in die FHEM Welt ist wirklich großartig gelungen.

Ich hoffe du fasst dies hier nicht als Minderung der Wertschätzung deiner Arbeit auf, denn das soll es nicht sein. Ich würde gerne dabei unterstützen die Qualität der Module noch weiter zu verbessern und auf ein einheitliches Niveau mit anderen FHEM Modulen im Multimedia/AV Bereich zu heben, damit diese in Teilen vergleichbar werden.

Dazu habe ich einige Punkte zusammengekritzelt. Es ist zugegebenermaßen so viel geworden, dass ich hoffe, dass du mir nachsehen kannst, sollte etwas zu knapp oder grammatikalisch fehlerhaft formuliert sein. Ich fände es prima, wenn wir uns darüber hier austauschen könnten  :) 

Allgemein habe ich folgende offenen Punkte für mich gefunden:



Einige Dinge wären dagegen "nice to have" und sind lediglich eine Anregung:

Dann wären da noch einige allgemeine Fragen, die sich mir auftaten:
Letztendlich noch einen Blick auf den Bereich Sicherheit:
Ich möchte gerne anbieten, dass ich bei der Verbesserung in den genannten Punkten unterstütze, sofern du das möchtest. Sei es durch Patches, Tests oder einfach nur Beistand  ;) 






Gruß
Julian
Titel: Antw:Sonos: Feedback zur Modulentwicklung
Beitrag von: Reinerlein am 02 Januar 2015, 18:17:53
Hi Loredo,

danke für die Ideen und Hinweise. Bei einigen hatte ich mir auch schon Gedanken gemacht, bei anderen eher weniger :)

Ich versuche mal zu den Themen was zu schreiben:

Soo... einiges geschrieben :)
Leider kann ich nicht alles anpassen. Das Ding ist ja schließlich in Benutzung. Aber wo es einfach geht, ist es jetzt eingecheckt.

Grüße
Reinerlein
Titel: Antw:Sonos: Feedback zur Modulentwicklung
Beitrag von: Loredo am 07 Januar 2015, 11:06:06

Hi Reinerlein,


merci für die prompte Antwort, da kam ich jetzt noch gar nicht hinterher ;-)


Zitat von: Reinerlein am 02 Januar 2015, 18:17:53
Thema webname: Das kann ich leider nicht beachten, da im SubProzess ja noch gar kein Aufruf über die Oberfläche gemacht wird. Erst wenn der Anwender das ganze mit seinem Browser aufruft, ist bekannt, über welche Instanz er das tut. Dann sind die Readings allerdings bereits gesetzt.
Das einzige, was ich tun kann, wäre ein eigenes Attribut dafür anzubieten, damit man das sozusagen etwas beeinflussen kann.


Beeinflussen allein genügt ja nicht, sonst wäre man ja auf eine bestimmte FHEM Instanz festgelegt (gesetz dem Fall man möchte beim Zugriff auf die eine Instanz vermeiden, dass Inhalte auch über die andere geladen werden). Klassisches Beispiel ist die Nutzung eines Reverse-Proxy, wie man ihn üblicherweise zwecks Absicherung und besserer Integration vor FHEM installiert. generateProxyAlbumArtURLs wird damit obligatorisch. Mir ist nicht klar weshalb du im Proxy-Bereich nicht dynamisch die URL generierst und sie stattdessen statisch im Reading festlegst? Mein Vorschlag wäre, im Reading das Prefix /fhem wegzulassen und zur Laufzeit, wenn das Proxy-Modul angesprochen wird, aus attr{global}{webname} vorne ranzustellen.


Zitat von: Reinerlein am 02 Januar 2015, 18:17:53
Kleingeschrieben getter/setter: Die sind jetzt alle Case-Insensitive


Ich weiß, es ist wie Korinthen kacken, aber die über FHEMWEB angezeigten getter/setter sollten dann ebenfalls der Kleinschreibungsregel folgen. Nun da im Code nicht mehr casesensitiv gearbeitet wird, gibts da auch keine Probleme für Bestandsinstallationen. Das sorgt für eine einheitliche Sortierreihenfolge aller getter/setter im Menü und somit wäre das Verhalten dann tatsächlich so, wie es bei anderen Modulen auch der Fall ist (Stichwort Vergleichbarkeit, Nutzergewohnheiten etc.)


Zitat von: Reinerlein am 02 Januar 2015, 18:17:53
Groß-/Kleinschreibung der Readings: Das hatte mal das System, dass die Titelinformationen mit "current", "info" und "next" beginnend in klein beginnen, und die anderen (damals Hauptsächlich "Systeminfos" wie Versionsnummer usw.) groß. Das ist bis auf drei/vier Readings, die eigentlich groß gehören auch immer noch so.
Nur kann man das natürlich nur mit erheblichem Aufwand bei den Benutzern (und auch auf meiner Seite) anpassen, weswegen ich das so lassen würde.


Ich biete mich da gerne an das anzupassen. Es ist auch mehr eine optische Sache so wie oben auch genannt (Sortierreihenfolge etc.).
Programmatisch dürfte es keinen Unterschied für Bestandsinstallationen machen, da die Readings nicht casesensitiv sind soweit ich weiß.


Zitat von: Reinerlein am 02 Januar 2015, 18:17:53
Einheitliche Setter bei SONOS und SONOSPLAYER: Ich habe jetzt die beiden ("PauseAll" und "StopAll") dupliziert zu "Pause" und "Stop".


Aus Convenincegründen würde ich die pauseAll und stopAll in FHEMWEB ausblenden und nur zur Erhaltung der Kompatibilität im Programmcode behalten (kommt wieder den Nutzergewohnheiten zugute).


Zitat von: Reinerlein am 02 Januar 2015, 18:17:53
Direkt-Verbindung zwischen Setter und Reading: Soweit ich das sehen konnte, gab es nur bei "Icon" das Problem. Diesen Setter habe ich in "RoomIcon" umbenannt, da ich davon ausgehe, dass das sowieso kaum einer verwendet (zumindest nicht automatisiert).


Um das nicht automatisierte geht es hier ja auch :-)
Es geht darum den aktuellen Wert in FHEMWEB vorausgewählt zu bekommen. Ist jetzt ja auch so, prima.


Zitat von: Reinerlein am 02 Januar 2015, 18:17:53
Thema True/False: Man konnte schon immer für "1" oder "0" auch "on" oder "off" angeben. Das war nur nicht dokumentiert. Ich habe die Auswahllisten der entsprechenden Setter nun mit "on"/"off" gefüllt.


Hier und dort fehlt es wohl noch. Nur die Auswahllisten anzupassen genügt hier allerdings nicht, auch die Readings müssen dann on/off statt 1/0 ausgeben, damit die Vorauswahl entsprechend funktioniert.


Zitat von: Reinerlein am 02 Januar 2015, 18:17:53
Die Werte der Readings sind zumeist direkt die Daten von den Playern. Das einzige selbst beschriebene Reading ist "Presence", und das möchte ich jetzt nicht mehr anders schreiben, da das sehr oft verwendet werden dürfte (z.B. überall im Modul selbst).


Ich schau mal, dass ich da einen Patch für schreibe. Wenn die Readings-Namen in Befehlen an SONOS wiederverwendet werden, sind diese dann case-insensitive?


Zitat von: Reinerlein am 02 Januar 2015, 18:17:53
Benennung der Attribute die sich auf Readings beziehen: Hier ist die interne Logik Auslöser für die Schreibweise. Es gibt z.B. auch die Attribute "minVolumeHeadphone" usw., die durch Aneinanderkettung im Code geprüft werden.
Auch hier: Es dürfte oft verwendet werden, und würde einen Haufen Arbeit beim Umbenennen nach sich ziehen.


Hm, das ist jetzt unglücklich. Da das Modul im SVN ja neu ist, wäre jetzt die richtige Zeit das noch zu ändern, bevor es mehr gefestigt ist. Ich finde es aus Sicht der Nutzergewohnheiten (kenne ich ein AV Modul, kann ich auch andere direkt in den gleichen Funktionen bedienen) sehr wichtig, dass es hier einheitlich wird.
Ich schaue auch hier mal, ob ich bei Gelegenheit einen Patch bereitstellen kann (ggf. inkl. Rückwärtskompatibilität).


Zitat von: Reinerlein am 02 Januar 2015, 18:17:53
Das Attribut "stateVariable": Es wurde geschaffen, als es die Möglichkeit in Fhem selber noch lange nicht gab. Jetzt dürfte es einigermaßen überflüssig sein, ausser das es wahrscheinlich etwas schneller verarbeitet wird, was aber nicht so wichtig sein dürfte. Aber es stört ja auch nicht. Die neue Variante kannst du ja auch verwenden...


Aus FHEM Sicht ist das Modul eigentlich neu, weil es neu im SVN als offizielles Modul angeboten wird. Ich bin kein Fan davon Altlasten gleich von Beginn an drin zu lassen, vor allem wenn sie Funktionen doppeln, die in FHEM zentral bereitgestellt sind. Die Nutzergewohnheiten sollten hier höher priorisiert werden. Nutzer kennen von anderen Modulen her stateFormat schon, daher sollte es auch hier keine verwirrende Dopplung geben. Außerdem: Sollte sich an stateFormat einmal etwas ändern, müsstest du das aus Konsistenzgründen in stateVariable nachziehen. Das macht für mich keinen Sinn.


Zitat von: Reinerlein am 02 Januar 2015, 18:17:53
Das Reading "location": Es ist aus dem UPnP-Part übernommen, dort heißt das so. Im Reading steht die Position des Device-Beschreibungsdokuments. Man kann es verwenden (und ich tue das intern auch reichlich), um selber eine Verbindung zum Player aufzubauen.


Ok, das verstehe ich. Dann wünsche ich mir ein zusätzliches Reading, welches nur die IP Adresse beinhaltet. Man mag das Reading location ja direkt für die Abfrage des einen XMLs nutzen können, aber schon für das Schicken von Befehlen muss ich doch den String schon wieder selbst auseinandernehmen und anders zusammensetzen (machst du sicherlich im Code auch so). Da wäre es besser, die zentralen Bestandteile als Readings einzeln bereitzustellen, damit nicht jeder Nutzer in seinem myUtils Code den String erst selbst auseinanderfieseln muss (wieder das Stichwort Convenience).


Zitat von: Reinerlein am 02 Januar 2015, 18:17:53
Fhem-AV-Kompatibilität: Da habe ich nicht drauf geachtet, zumal diese auch nach dem Sonos-Modul geschrieben wurde. Dazu habe ich schon mehrfach meine Meinung in irgendwelchen Posts kundgetan. Ich betrachte solch eine "Vereinheitlichung" als nicht relevant. Es wird in meinen Augen kein Nutzen erzielt. Wenn man ein Modul neu entwickelt, ist sowas sicher hilfreich um zumindest mal ähnliche Namen zu haben, aber bestehendes darauf anpassen... davon halte ich nicht viel...


Ich finde es wichtig, Nutzergewohnheiten zu respektieren und ihm die Möglichkeit zu geben, einmal gelerntes auch auf andere Module anzuwenden. Es macht für mich aus Nutzersicht keinen Sinn, dass die gleiche Funktion bei jedem Modul anders heißt, obwohl sie das gleiche tut. Da muss ich jedes Mal erst (einige länger als andere) in der Commandref studieren nur um zu schauen, wie jetzt das Äquivalent zu einem Befehl ist, den ich von einem anderen Modul schon kenne.
Es ist einfach eine Frage der Nutzerfreundlichkeit. Als netten Nebeneffekt kann man zudem Automatisierungscode, den man in seiner myUtils Datei schon für ein anderes AV Gerät geschrieben hat, dann ganz einfach für das Sonos Modul wiederverwenden (oder gar als generalisierte Funktion definieren, ohne dass man auf spezielle Eigenheiten einiger Geräte Rücksicht nehmen müsste).


Zitat von: Reinerlein am 02 Januar 2015, 18:17:53
Loglevel: Nun ja, jedem steht es frei, den Verbose-Level auf 0 zu setzen. Dann hast du nur ein paar wenige Zeilen im Log. Die Zahlen hinter dem Wort SONOS beziehen sich auf die Thread-Nummer, die da loggt. Ein Device kann ich nur selten angeben, da im SubProzess solche Unterscheidungen nicht wichtig sind. Im Fhem-Log bezieht es sich schon wegen der Verwendung des Standard-Logging-Mechanismusses auf die korrekten Devices...


Dann mache ich wohl was falsch.
Der Standardloglevel einer neuen FHEM Installation ist 3. Alle Module, die ich kenne, geben in diesem Level keinerlei Debug- oder unnötige Info-Meldungen aus, ohne dass vorher eine Nutzeraktion stattgefunden hätte.
Aber selbst wenn ich bei allen Sonosplayer Geräten und dem Sonos Gerät verbose=0 setze, bekomme ich noch solche unnötigen Ausgaben wie diese hier:


https://gist.github.com/jpawlowski/c416de56a6e7131338e9


Dies ist jetzt mal das Logfile, welches lediglich bisher in diesem Jahr durch Sonos entstanden ist. Gewaltig!


Ich kann dort nicht erkennen, dass der Name eines FHEM Devices dort erwähnt würde oder dass die Ausgaben gar meinem explizit gesetzten Verbose-Level entsprechen.


So nervig es ist und so unnötig es dir aus funktionaler Sicht erscheinen mag: Dem FHEM Standard entspricht das hier nicht.


Zitat von: Reinerlein am 02 Januar 2015, 18:17:53
Das mit dem "devStateIcon" habe ich noch nie verwendet. Da es aber ein Standard-Fhem-Attribut ist, solltest du es doch wie überall setzen können, oder?


Klar, geht auch. War nur ein Vorschlag, wie du deine automatisch angelegten Sonos Devices in den Standardsettings noch verbessern könntest (again, more convenient )


Zitat von: Reinerlein am 02 Januar 2015, 18:17:53
Zum Thema Speak: Hast du es denn schon mal verwendet? Das passiert natürlich, sonst hätte die Funktion ja keinen Sinn... Du kannst auch selber eine MP3-Datei temporär abspielen lassen (mit "PlayURITemp"), dort wird nach Beendigung auch der alte Zustand wieder hergestellt. Pass nur auf, wenn du Streams übergibst. Dann kommt er natürlich nicht wieder zurück zum alten Musikstück...


Ich habe das natürlich schon ausprobiert und war wie gesagt erstaunt, dass es eben nicht so wie erwartet funktioniert hat.
Im Logfile stand dann immer sowas:



2015.01.01 16:08:04 3: SONOS1: Temporary playing of "/RINCON_B8E93722EB1001400_MR_Speak.mp3" must wait, because another playing is in work...



Aber selbst wenn ich dann manuell die Wiedergabe gestoppt habe wurde das File nicht abgespielt. Das scheint dann wohl irgendwie ein Bug zu sein, bei dem ich nicht weiß wie ich die Ursache herausfinde


Zitat von: Reinerlein am 02 Januar 2015, 18:17:53
Thema pingtype: Die verschiedenen Varianten funktionieren unterschiedlich gut auf verschiedenen Systemen. Deshalb gibt es eine Auswahl dazu. Den geringsten Aufwand hat das System mit "syn", da keine Antwort des Empfängers abgewartet wird, sondern nur geprüft wird, ob eine Route zur ARP-Adresse des Players existiert (das beantwortet der Switch direkt selber). Leider haben gute Switches damit ein Problem, da diese einen langen ARP-Cache haben, und somit Devices immer noch als Aktiv gemeldet werden, obwohl diese bereits aus sind.
Ich verwende gerne "icmp", das ist das Standard-Ping-Verfahren, benötigt allerdings root-Rechte für den ausführenden Prozess (hier Fhem).


FHEM als root laufen zu lassen kommt bei einer ernsthaften Installation IMHO halt nicht in Frage, da es die Sicherheit zu stark gefährdet.
Ich hatte mit gesetzten pingtype generell das Problem, dass FHEM häufig blockiert war. Nicht dass Geräte noch da gewesen wären, die an waren.
Ich schalte auch meine Sonos nie aus, brauche das also eigentlich nicht. Was ich mir ursprünglich erhofft hatte war, dass die Erkennung der Sonos Geräte nach dem Neustart von FHEM schneller ginge. Das dauert bei mir oftmals bis zu 5 oder 10 Minuten, bis die Geräte wieder angesprochen werden können.


Zitat von: Reinerlein am 02 Januar 2015, 18:17:53
Thema userReadings: Diese benötigen Zeit in der Verarbeitung, sodass ich dem Anwender die Möglichkeit lassen will, diese auch einfach wieder zu entfernen. Viele nutzen die Funktionalität der abfragbaren Listen nicht. Die können an dieser Stelle optimieren, bzw. das auch so anpassen, wie sie es brauchen...


Ah, ok. Die Intention ist gut, nutzerfreundlicher fände ich es allerdings das über ein einfaches Attribut an-/abschaltbar zu haben.


Zitat von: Reinerlein am 02 Januar 2015, 18:17:53
Thema Proxy: Ich habe es so gebaut, dass der Durchgriff nur auf die Zoneplayer (und auf die Spotify-Cover-API) erfolgen kann. Und das auch nur, wenn man das Attribut "generateProxyAlbumArtURLs" aktiviert hat. Da wird aber nichts weiter mehr in der Player-URL beschränkt. Wenn man da also keinen Zugriff möchte, sollte man den aus lassen, bzw. weiter vorne einen Schuz sicherstellen.


Ok. Ich habe etwas hin und her probiert und es scheint wirklich nicht alles durchgereicht zu werden. Denke das langt und für den Zugriff auf FHEM übers Internet per Reverse-Proxy ist ohnehin eine Nutzerauthentifizierung erforderlich.








Gruß
Julian
Titel: Antw:Sonos: Feedback zur Modulentwicklung
Beitrag von: Reinerlein am 07 Januar 2015, 14:21:23
Hi Julian,

ok, ich werde das mal durchgehen... aber etwas vorweg:
Das Modul ist nicht neu. Es dürfte sogar das älteste Multimedia-Modul in Fhem sein (Initial Release mit den ersten, für mich lauffähigen, Funktionalitäten war im Januar 2013, also etwa zwei Jahre her).

Das bedeutet, dass es viele Menschen gibt, die das Modul auch solange verwenden, und ihren Code entsprechend aufgebaut haben.
Alle Änderungen müssen damit eindeutig abwärtskompatibel sein! Deshalb z.B. auch die Verdoppelung der Pause-Anweisung.

Ich möchte nicht, dass irgendwelche Readings (die meiner Meinung nach Case-Sensitive sind, da es Perl-Hashes sind) umbenannt werden, nur um irgendwelchen ästhetischen Ansprüchen zu genügen. Das gleiche gilt für die Anzeige der Befehle. Das ist schließlich zum einen Geschmackssache, und zum anderen viel Anpassungsaufwand...

Die Anpassung der Readings im Quellcode ist sehr(!) weitreichend und hat zunächst mal einen nicht überschaubaren Prüfaufwand zur Folge. Des weiteren natürlich die Folgen bei den Anwendern...
Ich möchte diesen Aufwand eigentlich weder in der Entwicklung noch auf Anwenderseite haben.

Aber schon mal konkret zu einigen Punkten, die ich ad hoc beantworten kann:
Das Logging: Du kannst am Sonos-Device das Verbose-Attribut auf 0 setzen. Das sollte eigentlich gehen, ansonsten ist das ein Bug. Deine Logausgaben habe ja alle den Level 1-3 gehabt. Die einzigen 0-er Logs waren Fehlermeldungen, dass der Port bereits belegt war (vermutlich nach einem Shutdown-Restart oder Rereadcfg), und er deswegen warten muss. Das sollte auf dem Level auch rauskommen.
Debug-Ausgaben kommen im Normalfall ab Level 4 und 5, wobei es dort noch eine Unterscheidung gibt, da bei 5 erhebliche Ausgaben erfolgen...

On/Off-Setter: Das habe ich wieder umgestellt auf 0/1. Da es im Code sehr oft verwendet (if ReadingsVal()), und in vielen eigenen Codeschnipsel so verwendet wird, ist die 0 oder 1 im Reading wichtig. Die Auswahl sollte dementsprechend passend die Zahlen anbieten. In eigenen Aufrufen kann man natürlich weiterhin on/off verwenden...

Reading-Patch: Was möchtest du denn da patchen? Das Wort "appeared" bzw. "disappeared" sollte wegen der Abwärtskompatibilität erhalten bleiben. Sonst kannst du dir da ja auch ein userReading zu machen...

Zu der location: Das braucht ein Anwender niemals. Auch ich verwende es nur, um das Beschreibungsdokument zu laden, und die IP-Adresse für den pingCheck zu verwenden. Nicht vergessen: Das läuft über UPnP. Keine direkte IP-Kommunikation im Modul selbst, alles per UPnP-Proxy gekapselt.
Der Ping ist nur zum Feststellen von abwesenden Playern, da diese beim Abschalten nix mehr senden (obwohl UPnP das vorsehen würde).
Diese Prüfung kannst du mit dem pingType auf "none" abschalten. Dann erfährst du aber nie, ob ein Player weg ist, und du erhältst u.U. Fehlermeldungen beim Ausführen eines Befehls.
Ob es schlau ist Fhem als root laufen zu lassen, muss jeder selbst entscheiden. Ich für meinen Teil betrachte das als absolut problemfrei, da auf meiner Fhem-Maschine nichts anderes läuft...
Wenn man das nicht will, kann man die anderen Ping-Verfahren ausprobieren, oder es halt abschalten...

Zu dem userReading bzgl. LastActionResult: Wenn die Komponenten einmal angelegt sind, werden sie vom Modul nicht mehr neu erzeugt. Du kannst also anpassen und löschen was du möchtest. Das initiale Anlegen ist nur eine Grundvorlage, und kann/sollte von den Anwendern angepasst werden, das bedeutet, dass man für das Erzeugen dieses userReading eigentlich auch kein Attribut braucht...

Zu dem Speak: Der Mechanismus im Hintergrund verwendet den Befehl "PlayURITemp", dieser kann nur einmal gleichzeitig pro Player gestartet werden. Hast du da vielleicht etwas in der Richtung zuvor gestartet?

Zu dem Rest schauen wir mal... Das ist ja auch ein Diskussionsforum :)

Grüße
Reinerlein