Automatischen erkennen was im MCE gespielt wird

Hallo,

wollte auch mal etwas zu den vielen guten sachen beitragen die hier so im Forum gepostet werden. Ich wollte in meinem Wohnzimmer mit MCE/VMC (genaugenommen gerade das Windows 7 MC - wie heißt das jetzt?) feststellen ob gerade Musik gehört wird oder ein Film geschaut wird oder ähnliches. Auf der Suche nach eine Schnitstelle ins VMC bin ich auf das SDK von MS gestoßen mit eine Aplikation die sich ‚MediaDisplaySampleApplication‘ nennt. Damit ist es möglich mit einem .net programm auszulesen wo sich der benutzer gerade im Menü befindet und was gerade abgespielt wird. Dank meiner eher bescheidenen Programmierkünste(naja - eher unlust mich in .net einzuarbeiten) hab ich die Beispielaplikation genommen und einfach eine TCP-Port Kommunikation eingebaut auf der versandt wird was da gerade passiert. In IP-Symcon musste ich das Ganze dann nur noch auswerten und jetzt geht bei ‚DVD‘ das Licht neben dem TV automatisch auf 20% und bei ‚Musik‘ das Zimmer in den Modus gemütlich. :smiley:

Das ganze ist nicht gut programmiert und ich weiß nicht ob mann es so(ein teil aus dem sdk?) weitergeben kann aber ich wollte es trotzdem anbieten wenn Interesse besteht. Es funktionier trotz ‚quick and dirty ziemlich‘ gut! Antwortet einfach wen Interesse besteht zu dem Beitrag.

Grüße aus Kassel,

Immanuel

Hallo Immanuel,

das ist genau daß, was was ich n och gesucht habe.
Ich schicke dir mal eine PM mit meiner E-mail. Wäre nett, wenn Du mir die Sachen zumailen könntest.

mfg
Smudo

Habs mal unter Nützliche Skripte verschoben. Ich denke, du kannst ohne Probleme Quellcode und/oder Binärdateien davon veröffentlichen.

paresy

Hallo,

für alle die es haben wollen: hab endlich mal etwas Zeit gefunden das Programm zu erweitern.

Zur Funktionsweise:

Ds Programm öffnet einen TCP Port mit der Nummer 4711 und wartet auf eingehende Verbindungen. Man kann sich dann mit IPS(Clientport anlegen und registerd variable) verbinden und bekommt alle medianänderungen die ich auslesen konnte geschickt.

Das Ganze basiert auf dem SDK 5.0 sample von MS MediaDisplay und ist nur etwas erweitert. Den grafischen Teil von MS hab ich so gelassen.

Damit MEdiaDisplay eine Verbindung zum MCE aufnehmen kann muss noch die beigelegte .reg installiert werden(und damit die zugehörige dll).

Das eine Verbindung zum MCE besteht seht ir an dem dastellen der richtigen inhalte in dem grafischen Display.

Hier noch ein Beispielcode für die IPS Seite (legt ne menge variablen an aber geht ganz gut):

<?
$object = IPS_GetObject($IPS_SELF);
$parentID = $object['ParentID'];

$instanceID = CreateDummyInstanceByName($parentID, "Media Center");

// Bei Datenempfang
if ($IPS_SENDER == "RegisterVariable")
{
    $Daten = explode(";", $IPS_VALUE);
    array_pop($Daten);

    foreach($Daten as $Datum)
    {
        $Datenarray = explode("=", $Datum);
        $Namenarray = explode(".", $Datenarray[0]);

        $Variablengruppe = $Namenarray[0];
        $Variablenname = $Namenarray[1];
        $Variablenwert = $Datenarray[1];

        $GruppenID = CreateDummyInstanceByName($instanceID, $Variablengruppe);
        $VariableID = CreateVariableByName($GruppenID, $Variablenname, 3);
        SetValueString($VariableID, $Variablenwert);
    }
}

//Installer
if ($IPS_SENDER == "Execute")
{
    IPS_SetHidden($IPS_SELF, true);
    IPS_SetName($IPS_SELF, "Mediacenter-Daten-auswerten");

    $parentObject = IPS_GetObject($parentID);

    if ($parentObject['ObjectType'] !== 1)
    {
        IPS_SetParent($IPS_SELF, $instanceID);
    }
}

//Ein paar Hilfsfunktionen, angelehnt oder kopiert aus dem IPS Forum
function CreateDummyInstanceByName($id, $name)
{
    global $IPS_SELF;
    $vid = @ IPS_GetInstanceIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this instance was created by script #$IPS_SELF");
    }
    return $vid;
}

function CreateVariableByName($id, $name, $type)
{
    global $IPS_SELF;
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
    }
    return $vid;
}
?>

Viele Grüße,

Immanuel

MediaDisplayTCP.rar (234 KB)

Hallo Immanuel,

höchst spannende Sache! Verstehe ich das richtig, dass IPS dann in periodischen Abständen WMC abfragt? In welchem Abstand machst du das?

Könnte man das nicht genau andersrum machen, also vom WMC an IPS pushen?

Danke & Gruß,
Axel

Noch ein Nachtrag: ihr müsst die MSASState.reg im Unterverzeichniss MSAS noch editeren, so dass sie auf den richtigen Speicherort verweist (hab die MSASState.dll bei mir in mein ehome verzeichniss verschoben), und dann das system neu starten.

@Axel: ja so ist das auch. Ich hab einfach alle Events von mce aboniert und schicke bei einem Ereigniss einfach alle Eigenschaften der verschiedenen mce Objekte (z.B. DVD. TV. …) an IPS - also push.

Grüße,

Immanuel

Hallo Immanuel,

ich bekomme das nichts ans Laufen. Socket auf 4711 wird zwar geöffnet, aber im Debug Fenster von IPS kommt nichts an.

MSASState.dll liegt im eHome, MSASState.reg angepasst und importiert. Habe den Ordner MediaDisplayTCP nach „C:\Program files“ kopiert und lasse die MediaDisplay.exe von dort aus Laufen. Habe Windows 7.

Noch eine Idee? Irgendwelche Abhängigkeiten?

Danke & Gruß,
Axel

Hallo,

also ich hab das gleiche Problem wie Alex. DLL kopiert, Reg editiert , aber im MediaDisplay wird nix angezeigt und somit kommt auch bei IPS nix an.

Ich hab Windows 7 . Vielleicht gibt es ja noch mal Hilfe von Immanuel .

Besten Dank

Hallo Immanuel,

hast du noch eine Idee? Irgendwelche Abhängigkeiten? DLL’s, .Net etc.?

Danke & Gruß,
Axel

Hallo,

bei mir war das anfangs auch.
Bei mir war die Firewall schuld, den Port 4711 Freigegeben und dann giengs.

Hoffe hilft dir was.

Gruß Sevi

Also bei mir läuft es auch nicht, kann es sein das es auf 64Bit Systemen nicht läuft ?

Gruß Sven

Hallo,

Etwas genauere Beschreibung meines Problems: TCP Kommunikation läuft, zumindest zeigt mir Netstat „established“. Firewall ist demnach ausgeschlossen.

Aber das Tool selbst - MediaDisplay.exe - zeigt nicht an, was im MC läuft - siehe Screenshot.

Mit dem Regfile bzw. der Codebase habe ich alles mögliche ausprobiert, schließlich im Original übernommen und die DLL dahin gelegt und neu gestartet. Leider kein Erfolg.

Evtl. liegt es am Codebase Eintrag des regfiles („file:///C:/Program Files/Microsoft SDKs/Windows Media Center/v5.0/Samples/MSAS Sample/MediaState/MSASState.DLL“).

Hat noch jemand eine Idee?

Danke & Gruß,
Axel

MediaDisplay.GIF

Immanuel hat in seinen zweiten Posting geschrieben das der Pfad angepasst werden muss.

Noch ein Nachtrag: ihr müsst die MSASState.reg im Unterverzeichniss MSAS noch editeren, so dass sie auf den richtigen Speicherort verweist (hab die MSASState.dll bei mir in mein ehome verzeichniss verschoben), und dann das system neu starten.

Sven

Danke, ganz dumm bin ich ja nicht. :wink: Habe wie ich schrieb ja auch bereits alles ausprobiert, bpsw. Original Regfile mit dll in entsprechendem Ordner.

Ich vermute es gibt noch weitere Abhängigkeiten aus dem SDK.

Danke & Gruß,
Axel

Hi,

ich habe mir das MC SDK 5.0 geladen, dann daraus MediaState.dll und MemMapFile.dll kopiert. Danach ging es sowohl im MediaDisplay (dem Tool), als auch in IPS :loveips:.

Danke Immanuel - super Sache!

Grüsse,
Axel

Hallo Immanuel,

da kommt ja wirklich so einiges rüber. Hab ein bisschen Sorge, dass die Logs von IPS überlaufen - Status wird immerhin Sekündlich komplett rübergesendet. Skript läuft jeweils einige ms.

Interessant ist m.E. eigentlich nur Play (oder MediaControl?), Type (TV, DVD…), MediaName und Channel. Unabhängig von der Group. Lässt sich das irgendwie schon in deinem Tool filtern?

Danke & Gruß,
Axel

Hab ein wenig Sorge, dass mein IPS zugespamt wird und deshalb das (sehr elegante) Skript von Immanuel mal auf die wesentlichen Variablen reduziert. Das sind meiner Meinung nach folgende:

  1. Play: Bool Var, gibt an ob was läuft oder Pause/Stop/Menu
  2. Type: DVD, TV, Bilder,Musik etc.
  3. Channel: Sendernummer…
  4. MediaName: Name der Sendung, DVD, Musik, Foto…
<?
$object = IPS_GetObject($IPS_SELF);
$parentID = $object['ParentID'];

$instanceID = CreateDummyInstanceByName($parentID, "Media Center");

// Bei Datenempfang
if ($IPS_SENDER == "RegisterVariable")
{
    $Daten = explode(";", $IPS_VALUE);
    array_pop($Daten);

    foreach($Daten as $Datum)
    {
        $Datenarray = explode("=", $Datum);
        $Namenarray = explode(".", $Datenarray[0]);

        $Variablengruppe = $Namenarray[0];
        $Variablenname = $Namenarray[1];
        $Variablenwert = $Datenarray[1];

        $GruppenID = 15353 /*[System\Media Center\Media Center]*/ ; // CreateDummyInstanceByName($instanceID, $Variablengruppe);

        Switch ($Variablenname){
           Case "Play":
                If ($Variablenwert == "True") {
                      SetValueBoolean (39633 /*[System\Media Center\Media Center\MC_Playing]*/,True);
                  } Else {
                      SetValueBoolean (39633 /*[System\Media Center\Media Center\MC_Playing]*/,False);
                  }
                Break;
           Case "Type":
              SetValueString (11395 /*[System\Media Center\Media Center\Type]*/,$Variablenwert);
                Break;
           Case "Channel":
              SetValueString (16102 /*[System\Media Center\Media Center\Channel]*/,$Variablenwert);
                Break;
           Case "MediaName":
              SetValueString (21934 /*[System\Media Center\Media Center\MediaName]*/,$Variablenwert);
                Break;

           Case "TrackTime":
                Break;
           Case "MediaTime":
                Break;

           Default:
                // Auskommentieren, um alle Variablen zu bekommen:
                // $VariableID = CreateVariableByName($GruppenID, $Variablenname, 3);
                // SetValueString($VariableID, $Variablenwert);
                Break;
        }
    }
}

//Installer
if ($IPS_SENDER == "Execute")
{
    IPS_SetHidden($IPS_SELF, true);
    IPS_SetName($IPS_SELF, "Mediacenter-Daten-auswerten");

    $parentObject = IPS_GetObject($parentID);

    if ($parentObject['ObjectType'] !== 1)
    {
        IPS_SetParent($IPS_SELF, $instanceID);
    }
}

//Ein paar Hilfsfunktionen, angelehnt oder kopiert aus dem IPS Forum
function CreateDummyInstanceByName($id, $name)
{
    global $IPS_SELF;
    $vid = @ IPS_GetInstanceIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this instance was created by script #$IPS_SELF");
    }
    return $vid;
}

function CreateVariableByName($id, $name, $type)
{
    global $IPS_SELF;
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
    }
    return $vid;
}
?>

Danke & Gruß,
Axel

MC.GIF

Hallo Axel,

schön, dass es bei dir funktioniert, bei mir tut sich nix. SDK 5.x runtergeladen, die beiden Dateien getauscht… trotz allem wird im Display ( Tool ) nix angezeigt.

Hallo pedocom,

lade dir das Zip anbei und entpacke alle ateien in C:\Program Files\Microsoft SDKs\Windows Media Center\v5.0\Samples\MSAS Sample\MediaState (im Zweifel Ordner anlegen). Dann Regfile aus dem Ordner ausführen und neu starten. Nach dem Neustart das Tool ausführen, dann sollte es den Status des Media Centers anzeigen…

Ich habe die 3 DLLs noch zusätzlich in c:\windows\system32 und c:\windows\eHome. Evtl. liegt’s daran.

Danke & Gruß,
Axel

MediaState.zip (42.7 KB)

hi,

werde das mal auf nem anderen PC testen. auf dem IPS geht das irgendwie nicht. DLLs so wie beschrieben gespeichert, Reg ausgeführt , neu gestartet. Zur sicherheit auch überall hin kopiert. Die MediaDisplay.exe hab ich unter IPS/Mediadisplay… mit all den Unterverzeichnissen.

System ist ein WIN7 64 Enterprise . Ich probier das morgen mal auf einem 32 Bit. Vielleicht hats irgendwas verdreht :-)… bis hier danke

Thomas