oweitman / ioBroker.squeezeboxrpc

This is an alternative Adapter that uses the JSON/RPC-Protokoll to get data and send commands to the Logitech Media Server.
MIT License
17 stars 8 forks source link

"squeezeboxrpc.0.Players.CCA_EssZimmer.Playlist" has no existing object, this might lead to an error in future versions #32

Closed hsteinme closed 2 years ago

hsteinme commented 3 years ago

Dann wird die Logdatei mit Warnings der folgenden Art überschüttet: "squeezeboxrpc.0.Players.CCA_EssZimmer.Playlist" has no existing object, this might lead to an error in future versions

Siehe https://forum.iobroker.net/topic/42385/js-controller-3-2-jetzt-im-stable?page=1: Einige Adapter werden Warnungen ausgeben wenn State-Werte gesetzt werden VOR dem Anlegen von Objekten.

oweitman commented 3 years ago

eigentlich sollte das schon seit letztem Jahr gefixt sein. Erst kürzlich habe ich das erneut getestet, da ich bei Favorites es vergessen habe einzubauen. Ich werde es nochmal testen. Hattest du noch vis laufen, mit widgets, die auf die datenpunkte zugreifen wollten?

hsteinme commented 3 years ago

Nein, vis habe ich nicht im Einsatz. Ich habe auch bei meinem heutigen Test alle Skripte, die auf die fraglichen Objekte zugreifen könnten, angehalten. Die Warnungen traten dennoch auf.

Anbei ein Debug-Log: iobroker.2021-04-20.log.html.zip

oweitman commented 3 years ago

ich habe mir das nun mal im Detail angeschaut. Grundsätzlich ist, wie bereits geschrieben, eine Prüfung ob ein Datenpunkt existiert eingebaut. Gemäß deiner Beschreibung konnte ich die Warnungen auch nachvollziehen, allerdings nur dann, wenn ich nach dem Löschen relativ schnell wieder den Adapter gestartet habe.

Für mich stellt sich das so das: Datenpunkte werden über die Oberfläche gelöscht. Sie werden auch nicht mehr angezeigt. Allerdings ist die Abarbeitung im Hintergrund durch iobroker noch nicht abgeschlossen. Mein Adapter startet. Findet einen Teil der Datenpunkte noch vor, da sie noch nicht gelöscht wurden und macht nichts. Dann kommt iobroker und löscht den Datenpunkt im Hintergrund und beim nächsten Schreiben des Datenpunkts durch mich, ist der nicht mehr da und die Warnung entsteht.

Ich muss mal im Forum diskutieren, wie ich damit umgehen soll. Eigentlich müsste ich vor jedem Schreibvorgang prüfen, ob es den DP gibt, falls nicht dann anlegen. Da dieser Adapter allerdings sehr Kommunikationsintensiv ist und alle 750ms ca. 40 Datenpunkte multipliziert mit der Anzahl der Player geschrieben werden, fallen diese zusätzlichen Kommandos schon ins Gewicht.

Kannst du mal prüfen, was passiert, wenn du nach dem löschen ein paar Sekunden wartest? so 10-20 Sekunden?

hsteinme commented 3 years ago

Danke, Oliver, für Dein Kümmern.

Unterhalb squeezeboxrpc.0.Players habe ich 5 Player. Ich nenne sie hier mal A, B, C, D und E. Vis ist nicht im Einsatz. Meine SqueezeBox-Skripten sind angehalten.

Hier meine Tests:

Danach stellte ich fest, dass (auch nach Neustart des Browserfensters) nur die Player A, B, C angelegt waren, nicht jedoch D und E. (Ob derartiges bei den ersten beiden Testfällen auch aufgetreten ist, weiss ich nicht. Ich hatte nicht darauf geachtet.) Ich habe dann die Instanz angehalten und erneut gestartet. Danach waren alle Player sichtbar. In der Logdatei fanden sich dann 1 x "no existing object" für Player A und 1 x "no existing object" für Player C.

Adapter erneut gestartet. Und wieder in der Logdatei 1 x "no existing object" für Player A und 1 x "no existing object" für Player C.

Meine SqueezeBox.Skripten gestartet und genutzt. In der Logdatei stehen dann 1 x "no existing object" für Player D und 1 x "no existing object" für Player E.

Bei allen Playern mit "no existing object" ist dabei immer ein Datenpunkt squeezeboxrpc.0.Players.*.Playlist erwähnt, den ich im Objektbaum nicht sehen kann.

hsteinme commented 3 years ago

Eine kleine "Gegenrede" zu https://forum.iobroker.net/post/630635;

In vielen meiner eingesetzten Adapter gibt es Situationen, wo sich Objekte im Umfeld geändert haben, aber die entsprechenden Objekte im ioBroker nicht die Änderungen nachgezogen haben. "Beliebte" Beispiele: Umbenennungen und Löschungen von Objekten. In diesem Fall kann die Situation geheilt werden durch

hsteinme commented 3 years ago

Wird eine neue Instanz des Adapters eingerichtet, so treten direkt danach die "no existing object" Warnungen ebenfalls en masse auf.

NeueInstanz.zip

oweitman commented 3 years ago

kannst du bitte mit der aktuellen version v1.3.6 in verbindung mit dem js-controller v3.3 nochmal neu testen?

oweitman commented 3 years ago

no feedback

hsteinme commented 3 years ago

Sorry, Oliver! Der Update auf js-controller v3.3 erfordert den vorherigen Update anderer Adapter. Zu dieser Update-Arie komme ich jedoch erst in frühestens zwei oder drei Wochen. Danach werde ich testen.

hsteinme commented 2 years ago

Heute habe ich meinen ioBroker auf eine "moderne" js-controller Version hochgezogen und zwar auf 4.0.15. Unter der SqueezeboxRPC Adapter Version 1.3.9 treten die gschilderten Probleme weiterhin auf:

Bitte das Issue wieder öffnen.

oweitman commented 2 years ago

ja das ist der gleiche Fehler wie zuvor auch schon, der auch in dem von dir genannten Thread im Forum besprochen worden ist. Das Problem tritt genau einmal auf, nämlich wenn eine neue Instanz angelegt und mit dem LMS verbunden wurde und wenn Datenpunkte gelöscht wurden und dann die Instanz gestartet wird. Es kommt daher, das iobroker eine gewisse Zeit braucht um alle meine Anfragen zum anlegen eines Datenpunktes abzuarbeiten, ich aber gleich den LMS abfrage und dann auch die Datenpunkte aktualisieren will, zu denen es zu diesem Zeitpunkt wohl noch nicht alle Datenpunktobjekte angelegt wurden. Dieses Problem tritt allerdings nur genau einmal auf, wenn ich a) eine neue Instanz anlege und mit dem LMS verbinde b) alle Datenpunkte lösche und dann die Instanz starte

bei jedem weiteren starten, tritt die Warnung nicht mehr auf.

Ich könnte nun das anlegen der Datenpunkte auf async/promises umstellen und abwarten bis alle promises erfüllt sind und dann erst mit dem abfragen starten. Ändert aber an der grundlegenden Funktion nix. Mal schauen, wann ich das mache. Als nächstes muss der Adapter-Test auf github-Actions umgestellt werden, dann die Konfigurationsoberfläche auf React.

hsteinme commented 2 years ago

Danke, Oliver, für Deine ausführliche Erläuterung. Die betrachtete Situation ist ja derzeit als reine Warnung noch kein "richtiges Problem". Dennoch sollten wir die Androhung "this might lead to an error in future versions" ernst nehmen. Einige Breaking Changes der jüngeren Vergangenheit haben ja schmerzlich gezeigt, dass nicht jeder Entwickler seinen Hang zu Erziehungsmaßnahmen unterdrücken kann 😄

oweitman commented 2 years ago

Ja ist unschön, aber nach einmaligen Neustart des Adapters wäre auch das Problem weg.

hsteinme commented 2 years ago

Der Datenpunkt .Playlist wird in Javaskripten über den $-Selektor gefunden. Sein zugehöriges Objekt ist null. Er wird aber nicht im Objekte-Tab angezeigt. Was ist der Zweck einer derartigen Konstellation?

oweitman commented 2 years ago

wenn in den adapter einstellungen provide playlistinfos as JSON angekreuzt wurden, dann stehen hier ein paar Informationen zum weiterverarbeiten drin. warum er nicht angezeigt wird obwohl er gefunden wird muss ich prüfen, evtl auch weil es null ist und nicht leerer string.

oweitman commented 2 years ago

Keine Reaktion mehr

hsteinme commented 2 years ago

(1) Reaktion auf was? Auf was wartest Du von mir? (2) Habe ich denn einen Hinweis "Behoben mit ..." übersehen?

oweitman commented 2 years ago

hattest du diese Einstellung mal angekreuzt? wenn in den adapter einstellungen provide playlistinfos as JSON angekreuzt wurden, dann stehen hier ein paar Informationen zum weiterverarbeiten drin. ich selbst kann es nicht nachvollziehen

hsteinme commented 2 years ago

Ja, wenn diese Option aktiviert ist, dann ist der Datenpunkt im Objektbaum zu sehen, wobei er bei manchen Playern gefüllt ist.

oweitman commented 2 years ago

dann ist ja alles gut. oder was ist das konkrete Problem noch? Der Datenpunkt existiert, er ist in der Doku beschrieben er wird halt nur gefüllt wenn die Option angekreuzt ist?

hsteinme commented 2 years ago

👍