Natives MediaPortal Plugin

Hallo,

eine erste „Proof-Of-Concept“ Version läuft, zwar noch recht unvollständig, aber immerhin: ein native in C# geschriebenes MediaPortal-Plugin für IP-Symcon.

Was man damit machen kann:

Ähnlich wie mit anderen Oberflächen, kann man über IP-Symcon steuern und visualisieren. Das ganze läuft im MediaPortal und läßt somit wie gewohnt bedienen.

Der Aufbau der Oberfläche ist etwas anders als bei WebFront oder auch anders als bei gewöhnlichen MP-Plugins. Die Oberfläche wird aktuell nicht generisch erzeugt, sondern man nutzt den MediaPortal SkinEditor (oder schreibt XML-Files).

Der Vorteil: man kann sich ganz individuelle Screens zusammen stellen und ist unabhängig von der konkreten Hierarchie in IPS. Nachteil: man muss etwas Handarbeit investieren.

Die IPS Objekte werden dann in die „Pages“ von MediaPortal über ein Binding eingebunden. Hierzu wird das Feld Description der MP-Controls „missbraucht“. Steht bei einem Button dort z.B. „RUN:4711“ so wird das IPS Script 4711 gestartet.

Bindings gibt es aktuell für Button, ToggleButtons, Images, Labels, Spinners und Select-Buttons.

Ich hab mal zwei Screenshots beigelegt und ein Beispiel hochgeladen.

In der Form funktioniert es natürlich nur mit meiner IPS-Konfiguration. Wenn man selber was ausprobieren will, muss man das Skin-File ipsymcon.xml entsprechend anpassen.

Viel Spass beim Testen, Feedback welcome.

Der Editor, der in Bild 2 zu sehen ist, ist hier beschrieben: http://forum.team-mediaportal.com/general-development-no-feature-request-here-48/there-need-skin-editor-69561/

Historie:
0.9.1.4:

  • spinner controls für var / status vars
  • encoding fix für IPS

0.9.1.3:

  • erste Version mit Dimmer für S7 (Step und Max sind aktuell fest).
  • Bugfix: beim Reopen des Plugin geht wieder alles

0.9.1.2:

  • bugfix für S7 Switch

0.9.1.1:

  • verbessertes Error-Handling
  • Setup Dialog zur Einstellung des IPS-Hosts
  • Integration S7 Switch

0.9.1:

  • Integration xComfort.
  • Umstellung Label-Binding auf C# String.format
  • Doku

Gruß Steve

MP4IPSymcon-0.9.1.4.zip (190 KB)

Hallo Steve,

ich als langjähriger Mediaportal nutzer , muss dir erstmal danken.

Nun zum Problem: als Host gebe ich den Namen meines Ips-System an,oder?

Gruß Michael

Ps:Die Mediaportal.xml liegt bei XP(Testrechner) im versteckten Ordner C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Team MediaPortal.Dort müssen auch die Skin-Dateien eingefüght werden.

Hi Michael,

ja klar den Host des IPS Systems. Von dort werden die WebServices importiert.

Das Plugin wurde gegen die aktuelle Beta 1.1.0 von MP entwickelt.

Und ja, seit der Version 1 liegen die Config-Daten mediaportal.xml und Skin XML-Files tyischerweise hier „C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Team MediaPortal\MediaPortal“.

Das Skin ist zum Test aktuell nur für Blue3 gemacht, aber leicht anzupassen.

Wenns bei Dir Probleme gibt, dann schick mir mal deine SkinFiles.

Gruss Steve

Hallo Steve,

Ok, alles klar, aber im Moment geht’s ja nur mit Fs20 , ich habe aber S7 und 1-wire im Einsatz.
Muss ich halt noch ein bisschen warten.

Gruß Michael

Hi Michael,

das zu erweitern ist kein grosses Problem, ich werde sicherlich bald den SourceCode veröffentlichen, dann kannst Du das ggf. selbst ändern.

Oder Du musst noch ein bisschen warten, bis ich selber Zeit dazu finde. Was wären denn das für Devices in IPS? Ich kenn mich leider gar nicht aus mit S7 oder 1-wire. Kannst du mir einen Tipp geben, wie ich eine Schalter / Dimmer dieser Sorte per IPS ansteuere?

Gruß Steve

Hallo Steve,

also S7 ist eine SPS von Siemens, 1-Wire sind Temperatursensoren von Maxim die über einen Bus verbunden sind.

Zur Ansteuerung, musst du das über Instancen lösen, warum nicht über Variablen und Profil oder geht das nicht?

Gruß Michael

Variablen auslesen, egal welche ist kein Problem. Das Binding sieht einfach so aus:

<description>VAR:26825:Temperatur {0:F1} °C</description>

Den hinteren Teil „Temperatur {0:F1} °C“ kannst Du auch weglassen, dann kommt die Var eben „roh“. Ansonsten gehen alle Formatierung von C# String.format im Beispiel oben „Float mit einer Nachkommastelle“.

Dieses Binding geht bei Label und bei Image. Bei Labels wird eben der Text ersetzt bei Image wird das in den Filename eingebaut. Damit lassen sich dann Zustände visualisieren. Z.b. Lampe an oder aus. Das habe ich in meinem Beispiel schon mit drin, nur an der Doku fehlt’s noch.

xComfort Switch und Dimmer geht inzwischen auch schon. Ich werds heute abend nochmal hochladen, dann vieleicht auch mit S7. Ich schau’s mir mal
an …

Gruss Steve

Wie schalte ich denn damit an und aus / dimme hoch und runter?

Gruß Steve

Hallo Steve,
vielen Dank für Deine Arbeit! :slight_smile:

Die Idee mit dem Skin Editor bzw. der Datei find ich gut, damit kann man flexibel arbeiten!

Das Schalten bei fs20 klappt bei mir zu ca. 80%:

  • nach mehrmaligem Schalten mit kleinem Warten klappt es manchmal nicht mehr
  • nach minimieren von MP geht nix mehr

Die Visualisierung:

  • ToogleButton beim FS20 an/ aus ist zuverlässig, wenn es schaltet
  • Anzeigen (boolean) einer Var oder des Status eines FS 20 DEvices wird bei mir garnicht ersetzt (Label).
  • Dementsprechend wird auch immer das true Bild für die Lampe angezeigt (egal ob ich die ID einer Lampe oder der Status-Var der Lampe angebe)

Ich habe derzeit MP 1.1 Beta und Windows 7 auf der IPS Test/Entwicklungs-Maschine, Firewall ist aus.
Eine Idee ? Oder liegt das noch am Code?

Grüße, Benjamin

Die Aktualisierung der Vars (Label / Image) klappt bei mir eigentlich immer, die ID die Du angeben muss, ist immer die der Variable.

In der aktuellen Version hab ich, das Binding für Images umgestellt. Es funktioniert nun genau wie bei Labels mit Format Strings.

Ausserdem ist nun etwas mehr Dokumentation und auch der Sourcecode dabei.

Ich lad’s gleich nochmal hoch. Ach ja xComfort Switch und Dimmer hab ich mal integriert, kanns aber nicht testen mangels Equipment.

Ich hab im Moment ein Problem mit dem Logging unter MP, das würde helfen bei Problemen etwas Licht ins Dunkel zu bringen. Aber irgendwie loggt es nicht???

Gruß Steve

Hab eben eine neue Version 0.9.1 online gestellt. Quellcode ist dabei.

Das logging geht jetzt auch. Wenn also Probleme austauchen, bitte mal das mediaportal.log nach MP4IPS durchsuchen.

Gruß Steve

Hi Steve,
das Wechseln des Bildes klappt nun und auch die Anzeige meiner Boolean Beispielvar (Abwesend True/ False) :loveips:

Das das Wechseln des Bildes nicht funktionierte und die Var nicht ausgegeben wurde lag an dem folgenden Ausschnitt im Skin:
Falsch:

  <description>VAR:38927</description>

Richtig:

  <description>VAR:38927:Anwesend {0}</description>

Lt. Debugger (attached an den Prozess) wird dann eine unbehandelte Exception „geworfen“, die anscheinend auch den Rest aus dem Tritt bringt.

Nach dem Minimieren von Mediaportal ist die Steuerung aber nach wie vor nicht funktional auch nach dem Beenden des Plugins (ESC) und Neustart des Plugins nicht. Exceptions gibt´s keine und im Log sind nur die Clicks:


2009-11-18 20:55:43.542903 [Info.][MPMain]: MP4IPS: IPS click to handle
2009-11-18 20:55:44.047932 [Info.][MPMain]: MP4IPS: IPS click to handle
2009-11-18 20:55:46.440069 [Info.][MPMain]: MP4IPS: IPS click to handle

Beim Debugging sieht es für mich so aus, dass zumindest beim IPSGetobject, obj richtig befüllt wird. Ich habe aber leider nicht so viel Erfahrung im Bereich OO und VS-Debugging um das sicher sagen zu können. Ein „Stopping Message Listener“ habe ich übrigens nicht in den Logs beim Beenden des Plugins.

Im Code habe ich nichts gesehen um Variablen zu Ändern, die Implementierung am Anfang würde aber eine Menge Work-Around-Möglichkeiten liefern. Es könnten dann alle bisher nicht unterstützten Devices per Varibale und Ipsymcon Event-Skripting nutzbar gemacht werden - zugegeben das ist über zwei Komponenten mehr schon jetzt leicht per „RUN“ möglich. :slight_smile:

Stefan, nochmals Danke für Deine Arbeit und ein großes Lob für den Code, der ist selbst für mich als nicht C# Profi lesbar und gut strukturiert!

Ich bin übrigens gerade mit dem Debugger beim Soronity Code (SONOS Multimedia Steuerung (www.sonos.com); ebenfalls C Sharp). Die Beispielapp kann man ggf. gut zum Befüllen von IPS Variablen mit Sonos Informationen nutzen - nur leider ist das Ding aktuell anscheinend nicht Threadsafe und stürzt zumindest bei mir außer im Einzelschritt oft ab, wobei ich das schon erträglich eingrenzen konnte. :wink: Mir schwebt da ein Proxy Prozess vor, der bei Event via upnp die Varibalen im IPS aktualisiert und umgekehrt. Ähnliches wurde hier auch im Itunes BiDi Thread für Itunes beschrieben.

Viele Grüße, Benjamin

Hi bengie,

die Definition hab ich schon etwas robuster gemacht, so dass kein Hänger mehr erfolgt, sondern eine Fehlermeldung im Log.

Klar das Schreiben von Variablen ist aktuell noch nicht möglich (nur per Script), steht aber weit oben auf meiner Liste. Ich dachte an Buttons (Wert setzen direkt ohne Hilfsscript), Spinner-Controls, evtl. Radio-Groups und Select-Buttons.

Das mit dem Minimieren / Verlassen und wieder aufrufen werd ich mir heute abend anschauen, das hängt sicher nur daran wie die Listener registiert werden. Ist halt mein erstes MP-Plugin.

Ich dachte übrigens auch daran bestimmte IPS-Vars als MP-Properties zu registieren. Dann kann man diese in anderen Screen oder als Laufschrift verwenden, bei Skins die das unterstützen.

BTW: der Quellcode ist nun im SVN für MP-Plugins: http://mp-plugins.svn.sourceforge.net/svnroot/mp-plugins/trunk/plugins/MP4IPSymcon/

gruss Steve

Hallo Steve,

also ich bekomme es einfach nicht zum laufen.

Mediaportal ist als Client installiert aktuelle Beta, Ips ebenfalls.Mediaportal.xml geändert auf.

<section name="MP4IPSymcon">
    <entry name="host">server</entry>
  </section>

ich hab eine Button die ein Script ausführen soll, und einen Temperaturwert,sie werden beide nicht angezeigt bzw. ausgeführt. In der Mediaportal.log steht.

2009-11-19 17:37:03.859375 [Info.][MPMain]: MP4IPS: MP4IpSymcon scanning controls
2009-11-19 17:37:06.406250 [Info.][MPMain]: OnMessage exception:System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
   bei MP4IPSymcon.Switch.create(GUIControl control, UInt16 oid, Int32 cmd) in c:\Dokumente und Einstellungen\sr\Eigene Dateien\Visual Studio 2008\Projects\MP4IPSymcon\MP4IPSymcon\Switch.cs:Zeile 28.
   bei MP4IPSymcon.Main.registerEventHandler() in c:\Dokumente und Einstellungen\sr\Eigene Dateien\Visual Studio 2008\Projects\MP4IPSymcon\MP4IPSymcon\Main.cs:Zeile 223.
   bei MP4IPSymcon.Main.OnPageLoad() in c:\Dokumente und Einstellungen\sr\Eigene Dateien\Visual Studio 2008\Projects\MP4IPSymcon\MP4IPSymcon\Main.cs:Zeile 121.
   bei MediaPortal.GUI.Library.GUIWindow.OnMessage(GUIMessage message)
2009-11-19 17:38:44.625000 [Info.][MPMain]: MP4IPS: MP4IpSymcon scanning controls
2009-11-19 17:38:44.671875 [Info.][MPMain]: OnMessage exception:System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
   bei MP4IPSymcon.Switch.create(GUIControl control, UInt16 oid, Int32 cmd) in c:\Dokumente und Einstellungen\sr\Eigene Dateien\Visual Studio 2008\Projects\MP4IPSymcon\MP4IPSymcon\Switch.cs:Zeile 28.
   bei MP4IPSymcon.Main.registerEventHandler() in c:\Dokumente und Einstellungen\sr\Eigene Dateien\Visual Studio 2008\Projects\MP4IPSymcon\MP4IPSymcon\Main.cs:Zeile 223.
   bei MP4IPSymcon.Main.OnPageLoad() in c:\Dokumente und Einstellungen\sr\Eigene Dateien\Visual Studio 2008\Projects\MP4IPSymcon\MP4IPSymcon\Main.cs:Zeile 121.

sieht so aus das keine Verbindung zustande kommt, Firewall’s sind beide aus.

Gruß Michael

Ps.: wegen dem Schreiben von S7-Werten, gibts die Befehle S7_WriteBoolean usw.

Hallo Michael,

das liegt einfach daran, dass S7 aktuell noch nicht unterstützt wird und die Fehlerbehandlung noch etwas armselig ist, daher bleibt das Plugin mit einem Fehler hängen.

Ich hab inzwischen das Error-Handling verbessert und falls das so einfach ist mit S7_WriteBit kann ich das auch schnell intergrieren. Wenn man mit writeBit schaltet, wie dimmt man denn dann?

Schau später nochmal vorbei, dann hab ich das mit writeBit sicher drin.

Gruß Steve

Hallo Steve,

also das mit dem Dimmen, ist so ne Sache, das einzeige was du machen kannst,
ist einen Real oder Integerwert schreiben , S7_WriteReal oder S7_WriteSmallint.
Eine richtige Dimmfunktion gibt’s nicht.

Das mit dem S7_Writebit müsste natürlich getoggelt werden, um eine Lampe zu schalten.

Gruss Michael

Hi Michael,

ich hab eben eine neue Version 0.9.1.1 hochgeladen, die auch S7
unterstützen sollte. Ich kanns natürlich nicht testen, weil ich keine
Siemens s7 habe.

Und getogglt wird das Bit dann, wenn Du ein ToggleBinding verwendest mit einem ToggleButton. Schau mal mein Beispiel an, da sind zwei ToggleButtons drin.

Alternativ nimmst Du zwei Buttons einen für „ein“ einen für „aus“ auch das ist in dem Beispiel drin.

Wenn nicht klappt, dann schick mir mal dein Skin und den Auszug aus dem Log.

Ach ja: dimmen mit S7. Werte schreiben geht schon auch, aber wie ist denn dann der Wertebereich? und in welchen Abstufungen?

Gruß Steve

Hallo Steve,

irgendwo klemmt’s.
Ich habe eine S7 Instance Büro Deckenbeleuchtung
Instanceid 28289 /[SYSTEM\S7\OG\BÜRO\Deckenbeleuchtung]/
Valueid 28653 /[SYSTEM\S7\OG\BÜRO\Deckenbeleuchtung\Value]/
welche muss ich nehmen.

verwende ich die erste sind die Buttons inaktiv, nehme ich die zweite passiert nicht, bei der image tut sich leider auch nichts.

Hab dir mal beide Dateien angehängt.

Gruss Michael

PS.: was mir immer passiert, mann muss die Instanceid nehmen um zu schreiben und die ValueId um zum lesen.

ipsymcon.xml (5.37 KB)

MediaPortal.xml (21.2 KB)

Hi Michael,

Du musst immer die Instance nehmen, die var von der der Status gelesen wird, findet das Plugin alleine. Allerdings war genau hier für S7 ein Problem.

Ich hab daher noch ein Update gemacht. Und nimm aus dem Beispiel mal alles raus bis auf einen ToggleButton, sonst bekommst Du zuviele Fehler im Log das verwirrt nur.

gruss steve

Hallo Steve,

jetzt geht’s soweit, aber wie bengie schon geschrieben hat , geht nach verlassen mit ESC nicht mehr und im log steht.

2009-11-20 12:27:49.750000 [Info.][MPMain]: MP4IPS: IPS click to handle
2009-11-20 12:27:51.906250 [Info.][MPMain]: MP4IPS: IPS click to handle
2009-11-20 12:27:55.906250 [Info.][MPMain]: MP4IPS: IPS click to handle
2009-11-20 12:28:13.500000 [Debug][MPMain]: Windowmanager: Goto previous window
2009-11-20 12:28:13.515625 [Debug][MPMain]: Window: MP4IPSymcon.Main deinit
2009-11-20 12:28:13.531250 [Debug][MPMain]: TextureManager: CleanupThumbs()
2009-11-20 12:28:13.546875 [Debug][MPMain]: Window: MediaPortal.GUI.Home.GUIPlugIns init
2009-11-20 12:28:14.921875 [Debug][MPMain]: Window: MediaPortal.GUI.Home.GUIPlugIns deinit
2009-11-20 12:28:14.921875 [Debug][MPMain]: TextureManager: CleanupThumbs()
2009-11-20 12:28:14.953125 [Debug][MPMain]: Window: MP4IPSymcon.Main init
2009-11-20 12:28:16.203125 [Info.][MPMain]: MP4IPS: IPS click to handle
2009-11-20 12:28:19.796875 [Info.][MPMain]: MP4IPS: IPS click to handle

Ebenso bei EIN/AUS Button und Statusbild.

Zu den Wertebereich :WORD#16BIT 1-32768
INTEGER#16BIT -32768 - +32767
REAL#32BIT ±1.175 495e-38 - ±3.402823e+38
(auszug von Step7)
Zu den Abstufungen , müsste man propieren z.B. 5.

Gruss Michael