Ankündigung

Einklappen
Keine Ankündigung bisher.

[mmh] Addon: Yamaha

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

    [mmh] Addon: Yamaha

    Hallo mmh-Fans,

    nach 1,5 Jahren bin ich nun endlich auf den mmh-Zug aufgesprungen.

    Erstes Ziel war 2 Addons zu integrieren:
    1. Yamaha Receiver (Modell 3900) per Ethernet, HTTP auf Port 80
    2. Pioneer-Plasma (Modell 600a) per RS232 und Moxa5110

    Bevor Punkt 1 habe ich auf dem HS den Yamaha integriert, damit ich "überprüfen konnte" ob der Yamaha auch so funktioniert wie erwartet und im Vorfeld abklären kann, ob es bei meinem ersten Addon an mir oder an mmh liegt.

    Also HS-seitig eingerichtet (siehe 2 Bilder im Anhang) --> auf Viso gesetzt --> funktioniert. Es ist ein HTTP-Aufruf mit Datenblöcken fest drangeklatscht.

    So, nun mmh-Addon eingerichtet. Erst auf HTTP gesetzt, aber da haut mir mmh immer ein GET danach hin. Mit Mike abgeklärt: statt HTTP nun TCP verwendet. Funktioniert trotzdem nicht.

    Meine Vermutung: mmh schneidet den XML-String vorzeitig ab, so dass es nicht klappt (sowohl Wireshark als auch das Protokoll zeigen einen nicht kompletten gesendeten XML-String, siehe 4. Screenshot im Anhang: bei on nach < abgebrochen, bei off nach Mode abgebrochen). Ich habe das aber Mike gemailt und daran soll es aber nicht liegen, da 8K übergeben werden können. Da mmh-Probleme lt. Mike ja zu 99,9% am User liegen und nicht an mmh, frage ich hier mal nach: hat schon jemand so einen langen String gesendet und hat dies funktionert?

    Ich verzweifle hier und hoffe nicht, dass es ein Tippfehler ist. Ich habe alle Texte copy&paste vom HS übernommen, da es dort ja funktioniert hatte. Nur CRLF habe ich dann halt entsprechend ergänzt...

    Prinzipiell sieht so der Text aus, den ich an den Yamaha senden muss auf Port 80:
    POST /YamahaRemoteControl/ctrl HTTP/1.1
    Content-Type: text/plain
    Content-length: 138
    HOST: 192.168.12.206

    <?xml version="1.0" encoding="utf-8"?>
    <YAMAHA_AV cmd="PUT">
    <Main_Zone>
    <Pure_Direct>
    <Mode>On</Mode>
    </Pure_Direct>
    </Main_Zone>
    </YAMAHA_AV>

    Hier nun mein mmh-Addon-CSV:
    [CONFIG];
    SERVERIP;192.168.12.206
    SERVERPORT;80
    SERVERMODE;ASCII
    SERVERTIMEOUT;0
    SERVERPROTOCOL;TCP

    [COMMANDS];
    PUREDIRECT_ON;POST /YamahaRemoteControl/ctrl HTTP/1.1\x0d\x0aContent-Type: text/plain\x0d\x0aContent-length: 138\x0d\x0aHOST: 192.168.12.206\x0d\x0a\x0d\x0a<?xml version="1.0" encoding="utf-8"?><YAMAHA_AV cmd="PUT"><Main_Zone><Pure_Direct><Mode>On</Mode></Pure_Direct></Main_Zone></YAMAHA_AV>\x0d\x0a
    PUREDIRECT_OFF;POST /YamahaRemoteControl/ctrl HTTP/1.1\x0d\x0aContent-Type: text/plain\x0d\x0aContent-length: 139\x0d\x0aHOST: 192.168.12.206\x0d\x0a\x0d\x0a<?xml version="1.0" encoding="utf-8"?><YAMAHA_AV cmd="PUT"><Main_Zone><Pure_Direct><Mode>Off</Mode></Pure_Direct></Main_Zone></YAMAHA_AV>\x0d\x0a


    Will einfach nicht funktionieren... Weiß jemand Rat? Bitte um Hilfe...

    Im Anhang habe ich auch noch ein Wireshark-Screenshot.

    Info kurz zu Punkt 2: Etwas aufwendiger, da noch Moxa im Spiel, aber gestern innerhalb 5 Minuten per mmh-Addon-eingerichtet: funktioniert tadellos, ohne das ohne am HS vorher einzurichten. Hätte ich scheinbar auch bei 1. so machen sollen, da mmh meinen Receiver nicht mag. Genau so hatte ich mir mmh vorgestellt. Geile Sache!

    Danke euch...

    Viele Grüße

    Thomas
    Angehängte Dateien
    Viele Grüße,

    Thomas

    #2
    Hallo Thomas,

    das ist in jedem Fall ein Problem auf unserer Seite. Habe das mal geprüft und es ist reproduzierbar. Selbst die TCP Klasse verweigert ihren Dienst beim Versenden des Strings... Ist allerdings eine Aufgabe für Sascha und der ist noch im Urlaub ....

    LG

    Kommentar


      #3
      Habe mal kurz Urlaub vom Urlaub...

      @Mike: Daß das mit der TCP-Klasse so nicht funktioniert ist klar, weil der zu sendende String < und > enthält, was ein mmh-Kommando einleitet bzw. beendet. Für solche Fälle sind die TCP- und UDP-Klassen auch nicht gedacht.

      @Thomas: Einfache Ursache, große Wirkung:
      Eine Zeile in der .csv darf maximal 255 Zeichen lang sein. Bei Deiner "Mörder-Sequenz" fehlt da natürlich etwas am Ende.

      Ich hab's mal umgebaut:
      [COMMANDS];
      HEADER;POST /YamahaRemoteControl/ctrl HTTP/1.1\x0d\x0aContent-Type: text/plain\x0d\x0aContent-length: 139\x0d\x0aHOST: 192.168.12.206\x0d\x0a\x0d\x0a<?xml version="1.0" encoding="utf-8"?><YAMAHA_AV cmd="PUT"><Main_Zone>
      PUREDIRECT_ON;<Pure_Direct><Mode>On</Mode></Pure_Direct>
      PUREDIRECT_OFF;<Pure_Direct><Mode>Off</Mode></Pure_Direct>
      FOOTER;</Main_Zone></YAMAHA_AV>\x0d\x0a

      die Kommandosequenzen lauten also:
      <YAMAHA><HEADER><PUREDIRECT_ON><FOOTER></YAMAHA>
      und
      <YAMAHA><HEADER><PUREDIRECT_OFF><FOOTER></YAMAHA>

      Probier' diese beiden Varianten doch bitte mal aus.

      mmh assembliert die Sequenzen der Einzelkommandos so lange, bis die Klasse geschlossen wird. Erst dann wird alles gesendet.
      Wenn man es noch schöner machen will, verpasst man dem HEADER noch ein Argument, in dem man dann die "content-length" manuell vorgeben kann.
      Die TCP-Klasse ist natürlich nur ein Workaround für das fehlende HTTP-Post (bisher hat es noch niemand benötigt), aber wenn Bedarf besteht, kann ich das sicherlich noch zur 1.1.00 einbauen.
      Gruß

      Sascha

      Kommentar


        #4
        Hallo mmh-Freunde,

        @Mike: ich habe mich schon lange nicht mehr auf eine negative Nachricht so gefreut wie heute. Ich bin wirklich schon fast verzweifelt mit mmh <--> Yamaha. Ich hatte dir ja selbstbewusst gemailt mit "Nadel im Heuhaufen" etc. und durch deine selbstbewussten Antworten war ich mir halt auch nicht 100% sicher, dass es nicht doch an mir liegt, v.a. nachdem es nach <ITUNES><NEXT></ITUNES> meine 2. Aktion überhaupt mit mmh war.

        @Sascha: Das mit dem HTTP-Post hatte ich Mike schon gemailt. Das ist natürlich schöner, das war mir von Anfang an klar. Jedoch knallt mmh dummerweise fest GET hinterher. Dies müsste ja bei einer neuen Version auch so bleiben, sonst müssten alle CommandServer die HTTP verwenden angepasst werden. Oder man liest die ersten Buchstaben in Commands nach ";" aus und wenn bei HTTP weder GET noch POST angegeben wird GET verwendet...

        Ich probiere das heute Abend aus und melde mich...

        Auf jeden Fall danke euch für eure Beiträge.

        Bis dann

        Thomas

        P.S. Danke dir Sascha, dass du kurz Urlaub vom Urlaub genommen hast!
        Viele Grüße,

        Thomas

        Kommentar


          #5
          Zitat von Thomas Beitrag anzeigen
          @Sascha: Das mit dem HTTP-Post hatte ich Mike schon gemailt. Das ist natürlich schöner, das war mir von Anfang an klar. Jedoch knallt mmh dummerweise fest GET hinterher. Dies müsste ja bei einer neuen Version auch so bleiben, sonst müssten alle CommandServer die HTTP verwenden angepasst werden. Oder man liest die ersten Buchstaben in Commands nach ";" aus und wenn bei HTTP weder GET noch POST angegeben wird GET verwendet...
          Nein, hier machst Du einen Denkfehler:
          der SERVERPROTOCOL;HTTP sorgt dafür, daß der Header komplett automatisch erzeugt wird! Deshalb wurschtelt Dir mmh auch immer ein GET in Deine Abfrage.
          Als Kommandosequenz gibt man also nur noch den Pfad auf dem Webserver an, z.B.:
          MAIN;/index.php
          und alles funktioniert - aber nur mit GET.
          Das Abstraktionslevel der HTTP-Definition liegt also eine Stufe höher als das der TCP-Definition. Deshalb kannst Du mit TCP machen, was Du willst.

          Natürlich kann man auch hier die URL aus mehreren Einzelkommandos zusammenbauen.

          Für den HTTP-Post-Fall werde ich also einfach einen neuen Protokolltyp HTTP_POST definieren, der einen POST-Header generiert. Über die Art und Weise, wie man den Body zur URL in der .csv angeben kann, mache ich mir noch Gedanken...
          Gruß

          Sascha

          Kommentar


            #6
            it works!!! Danke Sascha!

            Das mit der Content-length ist natürlich blöd, auch mit einem Arg muss ich immer den Länge vorher wissen/kontrollieren. Am besten würde mir natürlich gefallen, wenn du/ihr eine einen eigenen Servertyp machen würdet. SERVERTYPE;YAM sozusagen. Und der Header schon drin ist und die Content-Length aus dem XML-String von mmh ermittelt wird...

            Aber YAM ist halt nicht RUS. RUS haben hier 100 Mann im Forum, und YAM scheinbar nur ich (RUSS habe ich aber auch, YAM nur als Ergänzung im Wohnzimmer).

            Ich weiß aber auch nicht wie wichtig die content-lenght ist. Ich habe soeben dein Beispiel von oben verwendet (da war fälschlicherweise 139 statt 138 bei on angegeben) und siehe da: hat auch funktioniert... Heißt: was mache ich kaputt, wenn ich da 1000 eintrage und gut ist?
            Viele Grüße,

            Thomas

            Kommentar


              #7
              Gern geschehen.

              Zitat von Thomas Beitrag anzeigen
              Ich weiß aber auch nicht wie wichtig die content-lenght ist. Ich habe soeben dein Beispiel von oben verwendet (da war fälschlicherweise 139 statt 138 bei on angegeben) und siehe da: hat auch funktioniert... Heißt: was mache ich kaputt, wenn ich da 1000 eintrage und gut ist?
              Im Normalfall nix und das mit der 139 war Absicht.
              Die Content-Length sagt dem Server nur, wieviele Bytes eintreffen werden. Je nach Implementierung des Webservers kann es theoretisch vorkommen, daß der Webserver so lange wartet, bis die angegebene Zahl von Bytes angekommen ist. Praktisch habe ich so einen Fall noch nie erlebt und meistens wird schon allein aus Denial-of-Service-Abwehr-Gründen ausschließlich der Inhalt der Abfrage geparst und interpretiert -> Also ausprobieren, kaputtgehen kann nix.
              Die obige Implementierung hat den Vorteil, daß Du weitere Befehle relativ schmerzfrei einbauen kannst. Denn HEADER und FOOTER kann man ja so lassen (bzw. so gestalten, daß man sie nicht mehr anfassen muss), fehlen also nur noch die tatsächlichen Kommandos (eben genau wie die PUREDIRECT..-Befehle).
              Wenn man dann noch einen Schritt weitergeht, ersetzt man den HEADER durch CMDPREFIX und den FOOTER durch CMDSUFFIX (jeweils in der [CONFIG]-Sektion) und schon kann man mit <YAMAHA><PUREDIRECT_ON></YAMAHA> arbeiten...
              Gruß

              Sascha

              Kommentar


                #8
                so abschließend für alle die vielleicht auch mal einen Yamaha in Erwägung ziehen (auch CD kann man mit den großen wunderbar hören...): ich habe jetzt content-length auf 512 gesetzt und arbeite mit CMDPREFIX und CMDSUFFIX und alles klappt super. Für mich ist jetzt das Thema erledigt... Danke.

                Schönen Abend an alle mmh-Fans!
                Viele Grüße,

                Thomas

                Kommentar

                Lädt...
                X