Ankündigung

Einklappen
Keine Ankündigung bisher.

Plugin: Yamaha MusicCast-Geräte (neuere Generation)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Plugin: Yamaha MusicCast-Geräte (neuere Generation)

    Hallo,

    nachdem ich zu Weihnachten Zuwachs im AV-Pool bekommen habe, aber feststellen musste, dass die vorhandenen Plugins nicht mit dem Gerät reden wollen, habe ich ein neues Plugin geschrieben. (Das ist eigentlich gelogen, ich habe das bestehende yamaha-Plugin angepasst bzw. umgeschrieben. Dank an Raoul Thill für das Original!)

    Mit der Einführung von MusicCast (eine Yamaha-Multiroom-Lösung) hat Yamaha gleichzeitig das bisher verwendete Yamaha Network Control (YNC) API aufgegeben (?) und das neue Yamaha Extended Control (YXC) API eingeführt. Die Yamaha-Dokumentation habe ich mal angehängt.

    Das Protokoll basiert auf URL-basierten Abfragen per GET und liefert Daten als JSON-Datagramm zurück. Wenn das Plugin mit einem Gerät spricht, registriert es sich dort und bekommt für 10 MInuten nach dem jeweils letzten Kommando Daten als Push-Notification per UDP (auch im JSON-Format).

    Das Plugin ermöglicht die Statusabfrage und Steuerung von kompatiblen Geräten (Power, Volume, Mute, Input, Play/Pause/Stop/Skip F/R als Lese-/Schreibfunktion, Titel, Künstler, Albumart, aktuelle Wiedergabeposition, Titellänge als Nur-Lese-Daten).

    Im Rahmen der Entwicklung habe ich es intensiv getestet, die grundsätzliche Funktion ist vorhanden. Ob es in anderen Rahmenbedingungen Probleme gibt, kann ich mangels anderer Rahmenbedingungen derzeit nicht testen. Wer passende Geräte übrig hat, kann mir die gern zum Test überlassen [COLOR=#B1B1B1 !important][/COLOR][COLOR=#999999 !important]​[/COLOR]

    Ich biete das hier erstmal für Interessierte an. Für Rückmeldungen, Fehler und Funktionswünsche bin ich gern offen.

    Update: mit Release 1.7 ist das Plugin im sh.py-Plugin-Repository.

    Gruß
    Sebastian
    Angehängte Dateien
    Plugins for SmartHomeNG - The device integration platform for your smart home - smarthomeNG/plugins
    Zuletzt geändert von Morg; 07.04.2020, 20:27.

    #2
    Hallo,

    Hab gerade dein Plugin erfolgreich installiert.

    Hab auch zu Weihnachten mein Heimkino etwas aufgerüstet und mir einen Yamaha RX-A670 gekauft.

    Im moment nutze ich dein Plugin um abzufragen, ob der Receiver Ein ist oder auf Standby läuft, und dadurch steuere ich dann die
    Steckdose für den Aktiv-Subwoofer hinter der Couch.

    Mein alter Kenwood Receiver hatte hier einen extra Stromanschluss, den ich auf einen Binäreingang gelegt hatte und damit feststellen konnte, ob das Gerät läuft oder nicht.
    Der Yamaha hat das nicht mehr, dadurch hab ich mir mit deinem Plugin beholfen.

    Weißt du zufällig, ob der Yamaha Receiver das durchhält, wenn ich ihm alle 10sec. eine Updateabfrage schicke ?

    Noch was, bei jeder Triggerung des update-Items bekomm ich einen Logfile-Eintrag
    Code:
    2018-01-24  20:11:25 WARNING  plugins.yamahayxc No payload received.
    Was hat es damit aufsich ?
    Um das abzustellen hab ich die entsprechende Zeile (267) in der __init__.py Datei im moment auskommentiert.


    Gruß, Mike

    Kommentar


      #3
      Hi,

      schön, dass es erstmal läuft. Vorab - ich habe zum Testen nur den WX-010, daher ist wahrscheinlich sowohl das Nutzungsprofil als auch die Schwerpunkte bei der Umsetzung ggf. nicht ganz gleich. Wenn ich kann, passe ich das aber gern an.

      Grundsätzlich ist das für die Geräte kein Problem, wenn du die alle 10 Sekunden abfragst. Es reicht aber auch, wenn du alle (knapp) 10 Minuten einmal das Update-Item auf True setzt. Das löst eine Statusabfrage aus (aufgrund der Logik fragt er jedesmal den gesamten (implementierten) Status ab) - und dann teilt das Gerät dem sh.py per Push jede Änderung mit, und zwar 10 Minuten lang ab der letzten Aktion.

      Wenn also sowohl Receiver als auch sh.py Mediensteuerung ansonsten nicht miteinander reden, reicht alle 10 Minuten eine Statusabfrage und die nächsten 10 Minuten bekommst du alle Infos automatisch.

      Zum zweiten Teil:

      Intern merkt er, dass er ein Kommando senden soll, aber er weiß nicht, welches. Vielleicht habe ich da noch was übersehen?
      Wie triggerst du denn das Update-Item? Manuell im CLI/Backend? per Logik/item/eval? Und wie genau?

      Gruß
      Sebastian

      (PS: wenn es gut läuft, bekomme ich im Laufe des Quartals noch einen aktuellen Receiver, dann kann ich das etwas gezielter implementieren. Ansonsten brauche ich vielleicht zum Testen mal nen ssh-Tunnel auf deinen Receiver )

      Kommentar


        #4
        Danke für die Rückantwort, das ist gut zu wissen, dass der Receiver die Kommunikation für 10 Minuten aufrecht erhält, und so die Updates auch sendet.
        Hab es gerade getestet, funktioniert nach einem Update-Trigger auch noch nach mehreren Minuten, dass wenn ich das Gerät einschalte, dass der Zustand gemeldet wird.

        Das Update-Item triggere ich folgendermaßen:
        Der Receiver bekommt bei mir nur Saft, wenn die Steckdosen "TV-Geräte" eingeschaltet sind, und danach dauert es ca. 15sec. bis sich das Gerät im Netzwerk meldet.
        Dadurch hab ich den Status des Items TV-Geräte (sh.og.wohnen.geraete) ausgewertet, und sende einen Update Befehl sobald dieser auf EIN steht.
        Den AV-Receiver nutze ich nicht immer, bei normalen TV-Serien ist das Gerät z.B. in Standby, nur wenn ich BluRay oder TV-Filme auf SKY schaue läuft der Receiver.

        Code:
        media:
            RXA670:
                update:
                    type: bool
                    yamahayxc_cmd: state
                    enforce_updates: 'True'
                    cycle: 600
                    eval: True if sh.og.wohnen.geraete() else None
        Die Steckdose vom Subwoofer Triggere ich dann mit dem power Item des Plugins:
        Code:
        og
            wohnen
                subwoofer:
                    type: bool
                    knx_dpt: 1
                    knx_cache: 1/0/52
                    knx_send: 1/0/12
                    eval: sh.media.RXA670.power()
                    eval_trigger: media.RXA670.power

        Im moment bekomme ich beim Initialisieren vom SmarthomeNG immer eine Fehlermeldung wenn der Receiver nicht läuft, da er ja keine Verbindung zum Host herstellen kann,
        kann man das evtl. ändern, so dass die Verbindung nur aufgebaut wird, wenn das Update Item getriggert wird ? ansonsten läuft das Plugin soweit ganz gut.

        Wenns dir für die weiterentwicklung des Plugins hilft, kann ich dir gerne mal an einem Wochenende den Receiver über SSH Tunnel erreichbar machen.

        Gruß, Mike

        Kommentar


          #5
          Hm... ich könnte im Skript wahrscheinlich abfragen, ob der remote_host erreichbar ist und ggf. einen Fehler abfangen. Muss ich mir mal genauer anschauen. Mit der Variante, dass die Geräte gar nicht erreichbar sind, habe ich ehrlich gesagt noch nicht geplant.

          Den Fehler beim "state"-Kommando habe ich gefunden, da sollte ich am Wochenende zu kommen. Vielleicht fällt mir dann auch gleich was zum Kontakt ein (ggf. ein Kommando/Item device_present oder so...

          Kommentar


            #6
            So.. ich habe mal etwas dran gebastelt...

            1. Das Fehlerhandling sollte durchgängig erkennen, dass ein Gerät im Netz nicht verfügbar ist (gibt eine Logmeldung WARN aus) und stellt die aktuelle Aktion ein. Mit der nächsten manuellen (oder logik-gesteuerten) Aktion wird das Gerät wieder abgefragt. Es erfolgen keine automatischen Statusupdates, dies muss manuell über das update-Item erfolgen.
            Die Fehlerbehandlung sollte auch damit klarkommen, dass keine Daten gelesen werden können und _keine_ dementsprechenden Fehler ausgeben (die Meldung, dass das Gerät nicht erreichbar ist, wurde ja schon geloggt).

            2. Ich habe den Fehler bezüglich der Kommandobearbeitung behoben. Wenn nochmal ein Fehler "No payload received" im Log auftaucht, dann sagt mir das bitte. Das heißt dann, dass ich schlechten Programmcode geschrieben habe (die Meldung darf eigentlich nicht mehr auftauchen)

            3. Ich habe noch die Option/den Befehl "preset" hinzugefügt. Wenn z.B. die Internetradio-Quelle gewählt ist, kann man damit die voreingestellten Sender anwählen.

            4. Ich habe die ganze Kommentierung auf docstring aktualisiert und etwas erweitert - damit andere (und ich!) beim späteren Lesen verstehen können, wozu die einzelnen Funktionen gut sind. Von einem zum nächsten Mal vergesse ich das auch selbst ...

            Probier es mal aus und gib mir gern noch Feedback, wenn du mehr Funktionen brauchst oder Fehler oder unlogische Funktionen findest.

            Ich habe später noch wesentlich weitergehende Updates am Plugin vor:
            - flexible Unterstützung von mehreren Zonen (im Moment braucht jede Zone eigene Items)
            - umfangreichere Steuerung von AV-Verstärkern (Quellenwahl geht, aber z.B. Tuner auswählen/einstellen, Status vom Tuner abfragen) oder anderen Geräten (CD-Player mit Status/Steuerung usw)
            brauche ich dann neben mehr Zeit vor allem
            - ein passendes Gerät (Anschaffung AV-Receiver im 1. Halbjahr geplant )
            - Zeit zum Rumspielen

            Daher danke für dein Tunnelangebot - aber ich glaube, das braucht mehr Zeit als mal einen Nachmittag

            Kommentar


              #7
              Hi,

              Danke für das Update,

              Habs gerade installiert und getestet. Schaut soweit sehr gut aus, die Payload-Fehler sind weg, und wenn das Plugin getriggert wird und das Gerät ausgeschaltet ist, erscheint nur ein "Device not Answering..." im Logfile.

              Ein paar Feinheiten hab ich noch die noch nicht so ganz funktionieren, aber das liegt wohl eher an meinen bescheidenen Programmierkünsten.

              z.B. muss ich den Cycle jetzt wieder auf 60sec. zurückstellen, da beim einschalten der TV-Geräte Steckdosen der Receiver ja nicht sofort erreichbar ist,
              das Plugin aber sofort die Verbindung prüft und danach die Kommunikation einstellt. beim 2. Update-Trigger klappt das dann aber mit der Verbindung.
              Hier muss ich mir noch was basteln, dass der Update-Trigger erst 15sec. nach einschalten der Geräte Steckdosen angesteuert wird, dann sollte die Verbindung
              gleich klappen und mir reicht danach ein cycle von 10min.

              Hab mir jetzt mal auf die schnelle ein SmartVisu Widget gebastelt, die Grundfunktionen wie Lautstärke, Ein/Aus, Mute passen schon mal, nur Play,Pause,Stop will noch nicht so ganz wie es soll.
              Im Internetradio-Modus funktioniert die Titelanzeige, im DAB+ Betrieb nicht, aber das hast du ja erwähnt, dass es im moment nur auf Internetradio zugeschnitten ist.
              auch die Preset Funktion für die Sender, aber das ist für mich im Moment eh zweitrangig, da die hauptnutzung des Gerätes eh die Heimkino Funktion ist.


              Angehängte Dateien

              Kommentar


                #8
                Du kannst jederzeit das Update-Item triggern, "die Arbeit einstellen" heißt nur, dass das Plugin nicht versucht, die aktuelle Abfrage weiter zu bearbeiten. Du kannst - wenn du weißt, dass der Receiver an ist - auch gleich "normale" Befehle senden. Es wird kein Status "offline" gespeichert oder so.

                Das generelle Abfragen kannst du dann bei 600 Sekunden lassen (der push-Service startet ja automatisch wieder nach dem ersten Update) und ggf. per item-Trigger auf die Steckdose und 15-20 Sekunden Verzögerung (Logik mit sleep?) das Update-Item auf true setzen. Das sollte reichen.

                Ich habe das alte Multimedia-Widget mal etwas umgebastelt (mit net_radio als primäres Ziel, wie gehabt). Nicht wirklich schön, aber geht... ich habe es im widgets-Ordner unterhalb meines Seitenordners.
                Angehängte Dateien

                Kommentar


                  #9
                  So, das neueste Update 1.0.5 habe ich veröffentlicht, nachdem ich einige Fehler behoben und neue Funktionen eingebaut habe. Mit 1.0.3 kam die Funktion 'preset' für voreingestellte Sender mit dazu.

                  Zum Testen, aber auch für Funktionen, die sich nur schwierig 'systematisch' einbauen lassen, habe ich neu das Kommando 'passthru' eingebaut. Ein str-Item, dem dieses Kommando zugewiesen ist, kann als Wert den Kommandostring übergeben bekommen (z.B. 'v1/main/setPower?power=on'). Dieser wird 1:1 an das Gerät durchgereicht.

                  Da ich derzeit etwas mit (vorgefertigten) Playlists experimentiere und als Kommando 'v1/netusb/manageMcPlaylist?bank=1&type=play&index=0&zone=mai n' brauchte, bot sich diese Variante an. Leider sind diese Funktionen in den APIs nicht dokumentiert - glücklicherweise läuft das unverschlüsselt über HTTP [COLOR=#8E9D9F !important][/COLOR][COLOR=#7F9092 !important]​[/COLOR]

                  Mike, das könnte auch für dich interessant sein, wenn du Funktionen nutzen willst, die im Plugin noch nicht (ausreichend) implementiert sind... die API-Beschreibung für viele Kommandos habe ich ja im ersten Beitrag angehängt.

                  Kommentar


                    #10
                    Aktuell ist das Plugin jetzt in develop verfügbar. Dieser Thread dient als Support -Thread für das Plugin. Vielen Dank für den PR!

                    Kommentar


                      #11
                      Jetzt kanns losgehen mit dem Gerätekaufen...

                      Kommentar


                        #12
                        Version 1.0.6 habe ich per PR in Richtung develop geschoben. Aktuelle Änderungen:

                        - das Plugin unterstützt jetzt Geräte, die Weckerfunktionen haben (z.B. die ISX-Reihe). Wecker kann ein- und ausgeschaltete werden, der Piepton de-/aktiviert (statt bzw. zur Musik) und die Weckzeit kann verändert werden. Alle Werte werden automatisch abgefragt und aktualisiert.
                        Alle weiteren Weckfunktionen muss ich in einem gesonderten Ansatz einbauen, weil die Lese- und Schreiblogik bei Weckfunktionen völlig von der sonstigen Systematik abweicht. Ich will das Plugin dabei nicht noch kaputter machen

                        - ein paar kleinere Fehler behoben und Hinweise der Python-Linter umgesetzt

                        - die Item-Konfiguration kann jetzt alternativ per struct erfolgen: struct basic für "normale" Geräte und struct alarm für Wecker. Dank der verschachtelten Structs wird basic bei alarm automatisch eingebunden.

                        Außerdem habe ich festgestellt, dass das Plugin im 1.7er Release der Plugins drin ist

                        Kommentar


                          #13
                          Cool, danke. Bitte beim PR im Titel ein "Plugin: Yamahayxc" vorsetzen.

                          Kommentar


                            #14
                            Ich habe versucht, dass ich eine Scene TV einschalte. Ist das auch möglich.
                            Code:
                            <YAMAHA_AV cmd="PUT"><Main_Zone><Scene><Scene_Load>Scene2</Scene_Load></Scene></Main_Zone></YAMAHA_AV>

                            Kommentar


                              #15
                              Nee, so geht das nicht, wie kommst du denn auf die XML-Syntax? Du könntest das yxc_passthru-Item mit 'v1/main/recallScene?num=' füttern, das sollte gehen. Mein RX-AV483 kennt 4 Szenen, also könnte x = 1..4 sein.

                              Kommentar

                              Lädt...
                              X