XML-RPC Interface-Beschreibung

Nutzung von XML RPC, Remote Script, JSON RPC, XMLAPI

Moderator: Co-Administratoren

rayki
Beiträge: 73
Registriert: 23.01.2008, 16:30

Re: XML-RPC Interface-Beschreibung

Beitrag von rayki » 07.05.2012, 10:17

"system.multicall" ist ja im Prinzip nichts anderes, wie die übrigen XML-RPC-Methoden, die Du selbst implementiert hast (also z.B. die "event"-Methoden).
Du implementierst also z.B. einfach in der Klasse, in der Deine anderen XML-RPC-Methoden implementiert sind (z.B. "HomematicHandler"), eine Methode "mulicall", welche auf Deine anderen XML-RPC-Methoden (aslo z.B. "event") verzweigt.

Code: Alles auswählen

  public Boolean[] multicall(Object[] args) {
    Boolean res[] = new Boolean[args.length];  
    for (int i=0; i<args.length; i++) {
      Map<?, ?> call = (Map<?, ?>) args[i];
      String method = (String)call.get("methodName");
      Object[] margs = (Object[])call.get("params");
      ...
      if ("event".equals(method)) {
        // hier erfolgt der Aufruf der "event"-Methode
        event(margs[0].toString(), margs[1].toString(), margs[2].toString(), margs[3]);
        res[i] = Boolean.TRUE;
      }
...
  }
Anschließend muss nur noch die Klasse, in der die "multicall"-Methode implementiert ist, am Property-Handler registriert werden:

Code: Alles auswählen

        WebServer webServer = new WebServer(PORT);
        // create XML-RPC server
        XmlRpcServer rpcServer = webServer.getXmlRpcServer();
        // property handler
        PropertyHandlerMapping phm = new EmptyPropertyHandlerMapping();
        try {
          phm.addHandler("system", HomematicHandler.class);
          phm.addHandler("",       HomematicHandler.class);
          rpcServer.setHandlerMapping(phm);
 ...
Im Prinzip sollte es das schon sein... Das ganze lässt sich noch etwas optimieren, indem man eine eigene Handler-Klasse für den "system"-Call schreibt. Das Code-Beispiel soll auch nur mal das Prinzip verdeutlichen.

Gruß,
Rayk

DonGyros
Beiträge: 80
Registriert: 28.01.2008, 13:05

Re: XML-RPC Interface-Beschreibung

Beitrag von DonGyros » 09.05.2012, 11:05

Erstmal danke für das Beispiel!

Wie man sieht geht das auch einfach :-D In der Zwischenzeit hatte ich die abstrakte Klasse AbstractReflectiveHandlerMapping aus der Apache Lib überschrieben und dort die multicall Methode bereitgestellt.
Das hat soweit auch funktioniert und ich kann mir jetzt die Events auch direkt auf dem Fernseher anzeigen lassen :-)

AlexW
Beiträge: 6
Registriert: 13.05.2012, 17:19

Re: XML-RPC Interface-Beschreibung

Beitrag von AlexW » 14.07.2012, 14:59

Hallo Allerseits,
hat einer von Euch zufällig noch die PDF's auf Platte liegen die EQ3 veröffentlicht hatte? Denn ich finde die Dokumente nicht mehr und vermute das kommt durch den Relaunch der Seite.

Wäre super nett wenn ich dir irgendwie bekommen könnte!

Gruß Alex ;)

Goglo
Beiträge: 610
Registriert: 14.04.2012, 18:34
Danksagung erhalten: 1 Mal

Re: XML-RPC Interface-Beschreibung

Beitrag von Goglo » 20.07.2012, 19:04

Bitteschön
Dateianhänge
HM_XML-RPC_V1_502.pdf
(315.15 KiB) 366-mal heruntergeladen
83 Kanäle in 50 Geräten:
3x HM-LC-Sw1-Pl, 1x HM-WDS10-TH-O, 5x HM-PB-4-WM, 3x HM-PB-2-WM, 3x HM-LC-Dim1T-FM, 2x HM-Sec-SC, 4x HM-Sec-RHS, 5x HM-CC-VD, 4x HM-CC-TC, 5x HM-LC-Sw1-FM, 2x HM-Sec-MDIR, 1x HM-WDS30-T-O, 1x HM-LC-Sw1-Pl-2, 2x HM-PB-2-WM55, 1x HM-LC-Dim1L-CV, 1x HM-CCU-1, 1x HM-PBI-4-FM, 1x HM-LC-Dim1L-Pl-2, 1x HM-LC-Dim1T-CV, 1x HM-LC-Dim1L-Pl, 1x HM-LC-Sw2-FM, 1x HM-LC-Sw1-SM, 1x HM-Sec-WDS

82 Kanäle in 43 Geräten:
1x HM-PB-2-WM, 2x HM-LC-Bl1-FM, 3x HM-LC-Bl1PBU-FM, 3x HM-PB-2-WM55, 2x HM-PB-4-WM, 9x HM-CC-VD, 8x HM-CC-TC, 2x HM-LC-Sw2-FM, 1x HM-WDS10-TH-O, 1x HM-CCU-1, 1x HM-Sen-MDIR-O, 4x HM-LC-Sw1-FM, 2x HM-SwI-3-FM, 1x HM-LC-Sw4-SM, 1x HM-LC-Sw1-Pl-2, 1x HM-PBI-4-FM, 1x HM-WDS30-T-O

DonGyros
Beiträge: 80
Registriert: 28.01.2008, 13:05

Re: XML-RPC Interface-Beschreibung

Beitrag von DonGyros » 21.07.2012, 01:29

Irgendwie steh ich grad auf dem Schlauch und werde auch nicht schlauer aus den Infos die man im Netz findet.
Kann mir jemand verraten wie ich über die XML-RPC Schnittstelle an den Namen eines Gerätes komme?
Ich meine den Namen den ich in der Geräte-Liste (WEB-UI) für jedes Gerät frei vergeben kann (die erste Spalte 'Name').
Über die DeviceDescription schein ich da ja nicht wirklich ranzukommen oder hab ich da irgendwas übersehen?

EDIT:

ok, hat sich erledigt (hab mittlerweile die entsprechenden Infos dazu finden können)

Benutzeravatar
Homematic-wusel
Beiträge: 209
Registriert: 26.10.2012, 21:21
Wohnort: Weil der Stadt (im Ländle)
Danksagung erhalten: 2 Mal

Re: XML-RPC Interface-Beschreibung

Beitrag von Homematic-wusel » 06.11.2012, 22:40

Auch wenn der Thread schon etwas älter ist..möchte ich mich thematisch einmal "dranhängen".

Ich bin aktuell immer noch dabei mein "Homematic" System aufzubauen. Eine für mich wichtige Komponente ist ein Anzeigeterminal, welches ich über ein Tablet-PC bereits realisiert habe.

Zielstellung: [periodische] Abfrage der Zustände aller Aktoren/Sensoren für eine visuelle Darstellung sowie das Setzen von Zuständen einzelner Aktoren aus der grafischen Bedienoberfläche heraus .

Die Abfrage der Actoren habe ich über die RPC-XML Schnittstelle und ein eigenes .NET Programm realisiert. Die Abfrage der Komponenten klappt prinzipiell (anfangs) auch ganz gut ...leider nur für eine gewisse Zeit. Momentan frage ich die CCU im Intervall von 2 Sekunden auf den Status von 12 Aktoren (Schalter /Dimmer) ab. Nach etwa 20..30 Minuten bekomme ich statt der Statuswerte nur noch den "Fault-Code" -1 zurückgeliefert (laut Doku ein "allgemeiner" Fehler). Sobald dieser Zustand eintritt, laufen auch die Programme in der CCU nicht mehr ab. (Hier habe ich Beispielsweise eine eine Zeitbegrenzung für das Treppenhauslicht eingestellt). Periodische Abfragen scheint also die CCU auf Dauer nicht zu mögen.... :(

Eine Alternative wäre dazu ein RPC Server, welcher eventbezogen Informationen zu Statusänderungen der Aktoren geliefert bekommt. Dazu habe ich testweise in meinem .NET Programm einen TCP-Server implementiert ..und der CCU per RPC XML ein "INIIT"-Kommando übermittelt. Soweit....Sogut...verbindet sich auch die CCU auf die vorgegebene IP-Adresse + Port. Der TCP-Server bekommt eine Verbindung, ein erster Status-Datensatz wird erfolgreich übermittelt. (meist mein Kombisensor EC3 mit einer Temperaturänderung).
Danach passiert absolut nichts mehr...es werden keine Statusänderungen an den TCP-Server mehr übertragen...und auch eine remote Steuerung der Aktoren über die Web-Oberfläche der CCU ist nicht mehr möglich.
Sobald ich mein .NET Programm jedoch beende, reagiert die Web-Oberfläche der CCU wieder..es werden sogar alle zuvor dort abgesetzten Befehl brav nacheinander abgearbeitet !

Es sieht also irgendwie danach aus, als würde die CCU bei der Verbindung mit einem remoten Server nach jeder abgesetzen Information eine Art "Quittung" erwarten, bevor hier "weitergearbeitet wird "..und bis dahin ist die gesamte CCU irgendwie blockiert ?? :shock:
Leider finde ich in der RPC Schnittstellenbeschreibung auch nicht so wirklich für mich verwertbare Informationen, um hier wirklich weiterzukommen.

Daher meine Bitte / Frage an die Community: Gibt es hier bereits Lösungsansätze ( im Umfeld .NET & RPC XML) ... oder möglicherweise völlig andere Lösungsansätze (andere Schnittstelle ?..Addon ?) um mein gesetztes Ziel zu erreichen ?.

Danke für Eure Unterstützung !!

Benutzeravatar
Monty1979
Beiträge: 854
Registriert: 28.10.2010, 20:47
Wohnort: Bremen
Kontaktdaten:

Re: XML-RPC Interface-Beschreibung

Beitrag von Monty1979 » 07.11.2012, 00:05

Hallo,

ich komme zwar von der Insel Java aber ich versuch dir mal zu helfen :D

Die CCU mag keinen zu kleinen Intervall (über 2 Minuten ist kein Problem) und init() ist dafür die Lösung. Auf die Request der CCU muss dein Server im antworten wenn nicht gibt’s im Log der CCU einen Fehler-Eintrag. Das die CCU bei nicht Antwortet blockiert ist habe ich hier schon irgendwo gelesen allerdings konnte ich es noch nicht nachvollziehen.

Zur Frage wie bau ich eine RPC schau mal hier

Gruß Monty

rz259
Beiträge: 15
Registriert: 28.12.2012, 16:16

Re: XML-RPC Interface-Beschreibung

Beitrag von rz259 » 01.04.2013, 23:21

Hallo,

es wurde ja bereits die Frage nach der Kommunikation mit dem HMLAN-Adapter gestellt - ich habe derzeit auch nur den Adapter und würde ihn gerne für die Steuerung von HM benutzen. Ich würde nur ungern deswegen ständig einen PC am Laufen haben.
Derzeit nutze ich FHEM in Verbindung mit der Fritzbox.

Ich würde aber gerne lieber auf eine Java-basierte Lösung umsteigen, da ich entsprechendes Java-Know-How habe. Die Software könnte dann auf einem Raspberry PI laufen - ok, das ist zwar auch ein PC, aber der sollte nicht allzuviel Strom schlucken.

Bevor ich mich aber nun an ein solches Projekt mache, würde ich gerne eure Meinung hören, ob das überhaupt funktioniert. Dafür bräuchte ich einen XML-RPC-Server, der mit dem HMLAN kommunizieren kann. Ginge das mit einem XML-RPC-Server auf dem Raspberry PI? Oder brauche ich dafür wirklich einen Windows-PC?

Ciao,

Rudi

Benutzeravatar
Monty1979
Beiträge: 854
Registriert: 28.10.2010, 20:47
Wohnort: Bremen
Kontaktdaten:

Re: XML-RPC Interface-Beschreibung

Beitrag von Monty1979 » 02.04.2013, 15:21

Hallo,
rz259 hat geschrieben: Bevor ich mich aber nun an ein solches Projekt mache, würde ich gerne eure Meinung hören, ob das überhaupt funktioniert. Dafür bräuchte ich einen XML-RPC-Server, der mit dem HMLAN kommunizieren kann. Ginge das mit einem XML-RPC-Server auf dem Raspberry PI? Oder brauche ich dafür wirklich einen Windows-PC?
Bist du sicher das der HM-LAN Adapter als XML-Client verwendet werden kann?
Ich dachte den kann man nur mit der PC-Software oder über die CCU verbinden.

rz259
Beiträge: 15
Registriert: 28.12.2012, 16:16

Re: XML-RPC Interface-Beschreibung

Beitrag von rz259 » 04.08.2013, 21:27

Da hast du natürlich Recht, das hatte ich vergessen zu erwähnen - ich wollte eine CCU2 kaufen. Das habe ich inzwischen auch schon getan - ich bin seit einiger Zeit am rumbasteln.

Kennt jemand ein Beispiel in Java für die Interaktion mit HomeMatic? Insbesondere ein Beispiel für die Implementierung eines XML-RPC-Servers in Java, um die Events von HomeMatic zu erhalten, wäre mir sehr wichtig!

Ich bin gerade dabei, Forschungsarbeit zu machen. Es ist gar kein Problem, die CCU (bzw. CCU2) mit XML-RPC auf Basis von Apache XMLRPC für Java zu steuern.
Allerdings gestaltet sich das Empfangen von Events schwieriger als erwartet. Ich weiß, dass die Apache Library kein system.multicall implementiert, dies aber für benötigt wird, damit man die Events von HM auswerten kann.

Jetzt habe ich versucht, das Zeugs nachzuholen - ich habe eine Klasse erstellt, um mit meiner Software diese Events zu erhalten. Die Klasse
implementiert u. a. listDevices, newDevice, event(...), und auch system.multicall.
Ich habe die Klasse erstmal unabhängig von HM getest (durch einen eigenen Mini-Client) und habe dadurch herausgefunden, dass Apache XMLRPC standardmäßig erst mal keine void-Methoden mag. Außerdem gab es ein Problem mit der Methode event, da der letzte Parameter ein Object ist, was Apache XML-RPC auch nicht mag. Also habe ich erstmal mehrere event-Methoden geschrieben mit den passenden Parametern und lasse diese dann die generische Methode aufrufen.

Das hat dann auch soweit funktioniert. Nun wollte ich diese Klasse auch durch HomeMatic aufrufen lassen und habe mich mit einem init() dafür registriert.
Alledings kriege ich von HomeMatic keinerlei Events geschickt und es werden auch die anderen Methoden nicht aufgerufen. So wie es aussieht, ignoiert HomeMatic meine Klasse bzw. kennt sie überhaupt nicht.

Mein aktueller Stand in kurzen Worten ist der:

- Ich habe eine Klasse, die den XML-RPC-SErver implementiert (auch das system.multicall)
- diese Klasse wird mit einem PropertyHandlerMapping angemeldet, so dass zumindest "lokal" die Aufrufe von event(), etc. funktionieren - multicall jedoch funktioniert nicht, da fliegt mir ein RPC-Fehler um die Ohren ("No method matching arguments: java.util.HashMap")
- diese Klasse wird mit "init" bei HomeMatic angelmeldet, so dass ich eigentlich von HomeMatic auch events mitbekommen sollte - tut es aber nicht.
Als Ergebnis kriege ich einen Leerstring zurück, der nun gar nichts aussagt

Jetzt wäre ein Beispiel super, da ich momentan ein bißchen verloren bin - ich weiß nicht so recht, ob ich da auf dem richtigen Weg bin.

Vielleicht hat ja jemand einen Tipp für mich!


Vielen Dank,

Rudi

Antworten

Zurück zu „Softwareentwicklung von externen Applikationen“