How to: Yamaha - AVR mit Statusabfrage per Http

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

    #16
    Hallo.

    Als Hochsprachenprogrammierer fällt mir PicoC nicht schwer.

    Habe auch schon einen Plan wie die Statusabfrage für den Yamaha zu realisieren ist.
    Besteht noch Interesse? Falls ja, werde ich den Code zur Verfügung stellen, sobald ich Zeit finde, diesen umzusetzen.

    Kommentar

    • klenn
      Extension Master
      • 08.09.2015
      • 194

      #17
      habe noch nicht getestet, aber ich könnte mir vorstellen das man den Yamaha avr über virtuelle ausgänge steuern kann ist sogar ein template in loxone

      Kommentar

      • Rar9
        LoxBus Spammer
        • 25.08.2015
        • 219

        #18
        Zitat von Naehfix
        Hallo.

        Als Hochsprachenprogrammierer fällt mir PicoC nicht schwer.

        Habe auch schon einen Plan wie die Statusabfrage für den Yamaha zu realisieren ist.
        Besteht noch Interesse? Falls ja, werde ich den Code zur Verfügung stellen, sobald ich Zeit finde, diesen umzusetzen.
        Ja die Yamaha Statusabfrage besteht noch.
        Bin auch gerne bereit es zu testen


        Ich habe nur gemerkt das Neue Reciever keine web gui mehr anbieten.
        Zuletzt geändert von Rar9; 05.07.2016, 07:40.

        Kommentar

        • klenn
          Extension Master
          • 08.09.2015
          • 194

          #19
          guckt mal unter peipheri virtuelle E/A vordefinierte geräte da steht vileicht was brauchbares drinn

          Kommentar

          • Rar9
            LoxBus Spammer
            • 25.08.2015
            • 219

            #20
            Hier schon mal einige Screenshots für den ANFANG was mein recht alter RX-673 Reciever (2 Zonen) ausgibt.

            Die 2016 Reciever wie der RX-481D mit MusicCast haben kein Web GUI mehr :-( Ob die Befehle noch gleich sind kann ich erst später testen.




            Als erstes benötigen wir einen AN/AUS Status. Hier ein Beispiel for die Hauptzone.

            Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Off.jpg
Ansichten: 954
Größe: 152,1 KB
ID: 47253

            Der Rest der Abfragen sollte dann nur geschehen wenn Reciever = On ist

            Klicke auf die Grafik für eine vergrößerte Ansicht

Name: ON Main Zone.jpg
Ansichten: 864
Größe: 165,4 KB
ID: 47254

            Auswahl von Net-Radio

            Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Put Net-Radio.jpg
Ansichten: 858
Größe: 98,2 KB
ID: 47247
            Zuletzt geändert von Rar9; 05.07.2016, 16:30.

            Kommentar

            • Rar9
              LoxBus Spammer
              • 25.08.2015
              • 219

              #21
              mit Select & Play information (Das gleiche gibt es dann für Server, Napster, HDMI.... etc)

              Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Show Net-Radion Play list-song.jpg
Ansichten: 815
Größe: 117,3 KB
ID: 47249 Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Net-Radio Select List.jpg
Ansichten: 795
Größe: 157,8 KB
ID: 47250
              VolumenAbfrage (Achtung Mute) wird nicht angeben)


              Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Volume Abfrage.jpg
Ansichten: 768
Größe: 109,9 KB
ID: 47251
              Auswahl von Napster
              Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Put Napster.jpg
Ansichten: 830
Größe: 98,7 KB
ID: 47252

              Kommentar

              • Gast

                #22
                Hier mal eine erste Version des Pico Codes.
                Eingang AI1 muss mit UNGLEICH 0 beschaltet werden, damit die Schleife für die Abfrage läuft.
                Ausgang AQ1 gibt 1 an, wenn die Abfrage erfolgreich war, oder 0 wenn nicht.
                Ausgang AQ2 gibt 1 an, wenn der Yamaha auf ON steht
                Ausgang AQ3 gibt die Lautstärke in dB aus.

                Die Schleife im Code läuft endlos. Die Zykluszeit richtet sich natürlich nach der Netzwerkgeschwindigkeit, sowie der Antwortzeit des Yamahas und des Timeouts in der
                "stream_read" Funktion. Den Timeout habe ich da derzeit auf 200ms stehen. Hatte 100ms probiert, aber das war wohl zu kurz.

                WICHTIG: Recht weit oben müsst ihr natürlich noch die IP Adresse für euren Yamaha angeben. Dort steht derzeit meine

                Bitte gebt mal kurzes Feedback ob es funktioniert.

                #define RESPONSE_SIZE 40000
                #define READ_BUFFER_SIZE 1024
                #define OUTPUT_SUCCESS 0
                #define OUTPUT_POWER_ON 1
                #define OUTPUT_VOLUME 2

                #define OUTPUT_DEBUG 12

                while(true)
                {
                setoutput(OUTPUT_DEBUG, 0);
                //sleep(100);
                setoutput(OUTPUT_DEBUG, 1);
                if(getinput(0) == 0)
                {
                setoutput(OUTPUT_SUCCESS, 0);
                continue;
                }
                setoutput(OUTPUT_DEBUG, 2);
                //Open Stream (Modify IP Address)
                STREAM* pTcpStream = stream_create("/dev/tcp/192.168.178.4/80",0,0);
                setoutput(OUTPUT_DEBUG, 3);
                //Check if Stream is open
                if(pTcpStream == NULL)
                {
                setoutput(OUTPUT_SUCCESS, 0);
                return;
                }
                setoutput(OUTPUT_DEBUG, 4);
                char* pCmd = "POST /YamahaRemoteControl/ctrl HTTP/1.1\r\nContent-Type: text/xml; charset=UTF-8\r\nContent-Length: 131\r\n\r\n";
                char* pPost_Data = "<?xml version="1.0" encoding="utf-8"?><YAMAHA_AV cmd="GET"><Main_Zone><Basic_Status>GetParam</Basic_Status></Main_Zone></YAMAHA_AV>";

                stream_write(pTcpStream,pCmd,strlen(pCmd));
                setoutput(OUTPUT_DEBUG, 5);
                stream_write(pTcpStream,pPost_Data,strlen(pPost_Da ta));
                setoutput(OUTPUT_DEBUG, 6);
                stream_flush(pTcpStream);
                setoutput(OUTPUT_DEBUG, 7);
                char Response[RESPONSE_SIZE];
                char Read_Buffer[READ_BUFFER_SIZE];
                int nCnt;
                int nBytesReceived = 0;

                memset(Response, 0, RESPONSE_SIZE);
                setoutput(OUTPUT_DEBUG, 8);
                do
                {
                nCnt = stream_read(pTcpStream,Read_Buffer, READ_BUFFER_SIZE, 200);

                if (nCnt + nBytesReceived > RESPONSE_SIZE)
                {
                nBytesReceived = -1;
                break;
                }
                else if(nCnt > 0)
                {
                strncpy((char*)Response + nBytesReceived, Read_Buffer, nCnt);
                nBytesReceived += nCnt;
                }
                }
                while (nCnt > 0);

                setoutput(OUTPUT_DEBUG, 9);
                stream_close(pTcpStream);
                setoutput(OUTPUT_DEBUG, 10);

                char *pSearch;

                //Search Power State
                pSearch = strstrskip(Response, "<Power_Control><Power>");

                if(strncmp(pSearch, "On", 2) == 0)
                setoutput(OUTPUT_POWER_ON, 1);
                else
                setoutput(OUTPUT_POWER_ON, 0);
                setoutput(OUTPUT_DEBUG, 11);

                pSearch = strstrskip(Response, "<Volume><Lvl><Val>");
                float Volume = atof(pSearch) / 10.0f;
                setoutput(OUTPUT_VOLUME, Volume);

                setoutput(OUTPUT_DEBUG, 12);

                //Request was successfull
                setoutput(OUTPUT_SUCCESS, 1);
                setoutput(OUTPUT_DEBUG, 13);
                }

                Kommentar

                • Rar9
                  LoxBus Spammer
                  • 25.08.2015
                  • 219

                  #23
                  Moin Naehfix Super Anfang ..... Nur leider reicht es bei mir nicht aus nur die IP zu ändern.

                  STREAM* pTcpStream = stream_create("/dev/tcp/192.168.0.30/80",0,0);

                  Ich habe eine VI zum Testen am AI1 Programierbaustein dranngehängt

                  Nach 1x drücken erhalten ich leider unter AQ13 = 1


                  Für MUTE Status & SOURCE Input müsste ich folgenden ergänzen?

                  #define OUTPUT_MUTE 3 // Out MUTE Status on AI3
                  #define OUTPUT_SOURCE 4 // Out Input-Source Status on AI4

                  //Search Mute State
                  pSearch = strstrskip(Response, "<Mute>");

                  if(strncmp(pSearch, "On", 2) == 0)
                  setoutput(OUTPUT_MUTE, 1);
                  else
                  setoutput(OUTPUT_MUTE, 0);
                  setoutput(OUTPUT_DEBUG, 11);

                  //Search Input Source State
                  pSearch = strstrskip(Response, "<<Input_Sel>");
                  float Source= atof(pSearch) / 10.0f;
                  setoutput(OUTPUT_SOURCE, Source);


                  Wie würde ich zB bei Mute = ON (1) einfach Volume = Mute ON setzen?

                  Um die Tuner, Server, Napster & Net-Radio auch über GUI zu nutzen bräuchten wir dann noch die Auswertung nach Input Source.

                  Wie würde das in gleichen Script ausgewertet und reichen die dann die READ_BUFFER_SIZE 1024?

                  Beispiel Net-Radio
                  <?xml version="1.0" encoding="utf-8"?><YAMAHA_AV cmd="GET"><NET_RADIO><List_Info>GetParam</List_Info></NET_RADIO></YAMAHA_AV>" // Status Abfage Net Radio Playlist



                  Kommentar

                  • Gast

                    #24
                    Hi Rar9,

                    der Eingang AI1 muss länger als nur für einen Impuls beschaltet sein. Sprich einen Schalter...nicht einen Taster.

                    Ich habe bei mir zum Testen eine Konstante mit dem Wert 1,0 erstellt und angehängt. Quasi Dauerbetrieb.

                    Deine Abfragen für Mute sollte gehen. Bei der Input_Sel steht glaube ich auch ein String wie "HDMI1". Da kommst du mit "atof()" nicht weit.
                    "atof()" wandelt einen Zahlenstring in einen Float-Wert um. Wenn dort aber z.B. "HDMI1" steht kommt da nix bei raus.
                    Da müsste man quasi auf alle Möglichkeiten (HDMI1, HDMI2 etc.) prüfen und je nach Fall dann einen Wert (0, 1, 2...) an einen Ausgang schalten.

                    Was genau meinst du mit "Wie würde ich zB bei Mute = ON (1) einfach Volume = Mute ON setzen?"?

                    Man kann sicher auch Tuner etc. auswerten. Der READ_BUFFER_SIZE 1024 ist nur ein zwischenpuffer für das Lesen vom Stream.
                    Der eigentliche Puffer, welcher groß genug für die komplette Antwort sein muss ist "char Response[RESPONSE_SIZE];".

                    Ich werde den Baustein noch weiter verfeinern und nach Möglichkeiten etwas aufräumen. Das war nur ein erster Wurf, welchen ich gestern Abend in ner halben Stunde zusammengebastelt habe.
                    Sozusagen eine Art "Proof of Concept".

                    Gruß
                    Marc

                    Kommentar

                    • Rar9
                      LoxBus Spammer
                      • 25.08.2015
                      • 219

                      #25
                      Zum Verständnis.

                      Wenn ich per etwas an der Stereoanlage änder, soll mir dieses PicoC Programm den aktuellen Status wenn benötigt ohne großen Zeitverzögerung darstellen.

                      Somit sollte ich ZB. per Ulux Taster die Lautstärke regeln soll mit diese sofort angezeigt werden. Aktuell haben ich per Http Abfrage ca 10 Sec Zeitverzögerung.


                      Jetzt noch einmal zu dem Program. Wie kann ich testen was as mit der BZGL der IP falsch ist?

                      Bei Meiner Abfrage per Virtuellen Ausgang geht folgendes:

                      Adresse http://192.168.0.30:80
                      Befehl bei EIN : /YamahaRemoteControl/ctrl
                      HTTP-POST Befehl bei EIN: <?xml version="1.0" encoding="utf-8"?><YAMAHA_AV cmd="GET"><Main_Zone><Basic_Status>GetParam</Basic_Status></Main_Zone></YAMAHA_AV>
                      HTTP-Antwort speichern /user/common/answer.xml

                      Mit MUTE mein ich das bei Volume noch die DB Zahlen stehen auch wenn MUTE ON an ist.
                      Um Platz zu sparen sollte bei Volumen dann Mute ON oder 0 Stehen

                      Bzgl Source wie Werte ich dann die HDMI1 ---> HDMIx aus? Mir reicht es wenn Text ausgegeben werden kann, diesen kann ich dann per Statusbaustein auswerten. benötigen wir ja auch für die Song Texte brauchen.

                      Kommentar

                      • Gast

                        #26
                        Ist schon Verstanden wie das Funktionieren soll.
                        Mein Baustein ist aktuell so gebaut das dieser zyklisch permanent den Status vom Yamaha abruft.
                        Der Eingang AI1 ist lediglich dazu gedacht, diesen zyklischen Abruf "pausieren" zu können.

                        Im Prinzip würde es wie folgt laufen:

                        Mein Baustein ruft kontinuierlich den Status ab.
                        Steuern tust du wie gehabt über die virtuellen HTTP Ausgänge. Diese werden ja ohne Verzögerung gesendet.

                        Ich könnte meinen Baustein auch abändern, so das dieser auf einen "Change" beim AI1 einmal den Status abruft.
                        Aber dann könnte es zu Überschneidungen kommen.
                        Sprich der Befehl für höhere Lautstärke könnte gesendet werden, aber beim (dann per Impuls gesteuertem) Abruf über meinen Baustein der Status vom Yamaha noch nicht aktualisiert gesendet wird.

                        Bezüglich Texte....da hätte ich mal ne Frage. Bin ja noch recht bei Loxone. Ich kann zwar einen Text an die 3 Textausgänge des PicoC Bausteins schreiben.....
                        aber wie gehts von da aus weiter? Virtuelle Ausgänge als auch Merker nehmen keine Texte entgegen. Kann den Ausgang an einen Logger hängen...das nützt nur nicht so viel.

                        Die Source könnte man wie folgt auswerten:

                        - Prüfe String im Source Feld.
                        - Wenn "HDMI1" -> Setze Ausgang X auf 0
                        - Wenn "HDMI2" -> Setze Ausgang X auf 1
                        - usw.

                        Man müsste sich dann auf Source -> Wert Zuweisungen einigen.

                        Wie aber bekommt man dann den Titel von einem Song in die Visu von Loxone?

                        Bezüglich deines "IP" Fehlers.
                        Schalte den Eingang AI1 mal per Konstante auf 1 und schau ob an den Ausgängen was ankommt. Damit wäre dann zumindest bestätigt, das es vom Prinzip her funktioniert.

                        Gruß
                        Marc

                        Kommentar

                        • Rar9
                          LoxBus Spammer
                          • 25.08.2015
                          • 219

                          #27
                          ich erhalte aktuell folgende Fehlermeldung per Virtuellem Status. :


                          char* pPost_Data = "<?xml version="1.0" encoding="utf-8"?><YAMAHA_AV cmd="GET"><Main_Zone><Basic_Status>GetParam</Basic_Status></Main_Zone></YAMAHA_AV>"; ^ Programm Yamaha Statusabfrage:36:35 value not expected here

                          Kommentar

                          • Gast

                            #28
                            Ah ich sehe es. Ist wohl beim kopieren ins Forum schief gegangen.

                            char* pPost_Data = "<?xml version="1.0" encoding="utf-8"?><YAMAHA_AV cmd="GET"><Main_Zone><Basic_Status>GetParam</Basic_Status></Main_Zone></YAMAHA_AV>";

                            bei dem String der dort angegeben ist musst du allen Anführungszeichen ein Backslash '\' voranstellen. Sonst wird der String unterbrochen. Der Backslash ist wohl beim kopieren hier ins Forum flöten gegangen.

                            Also bei xml version="1.0" sowie encoding="utf-8" und cmd="GET" muss bei allen Anführungszeichen ein Backslash davor.

                            Kommentar

                            • Rar9
                              LoxBus Spammer
                              • 25.08.2015
                              • 219

                              #29
                              Sorry geht immer noch nicht.....bitte um Orginal als Txt Datei da es ne Menge " gibt.


                              Jetzt kommt

                              char* pPost_Data = "<?xml version="1.0" encoding="utf-8"?><YAMAHA_AV cmd="GET"><Main_Zone><Basic_Status>GetParam</Basic_Status></Main_Zone></YAMAHA_AV>";

                              ^ Programm Yamaha Statusabfrage:36:20 illegal character '\'

                              Kommentar

                              • Gast

                                #30
                                Eine gute Idee Machen wir in Zukunft besser immer so.
                                Angehängte Dateien

                                Kommentar

                                Lädt...